Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中使用EXSLT或XSL 2处理XML文档?_Xml_Swift_Exslt - Fatal编程技术网

如何在Swift中使用EXSLT或XSL 2处理XML文档?

如何在Swift中使用EXSLT或XSL 2处理XML文档?,xml,swift,exslt,Xml,Swift,Exslt,我的Swift应用程序生成一个XMLDocument,然后使用XSLT进行转换: xmlDocument.object(byApplyingXSLTString: xsltString, arguments: nil) 在我的XSLT样式表(xsltString)中,我希望使用XPath访问结果树片段。XSLT1.0不支持这一点;我尝试使用XSLT2.0,但Swift似乎不支持它;在xsl:stylesheet元素中指定version=“2.0”会产生以下错误: xsl:version: on

我的Swift应用程序生成一个XMLDocument,然后使用XSLT进行转换:

xmlDocument.object(byApplyingXSLTString: xsltString, arguments: nil)
在我的XSLT样式表(
xsltString
)中,我希望使用XPath访问结果树片段。XSLT1.0不支持这一点;我尝试使用XSLT2.0,但Swift似乎不支持它;在
xsl:stylesheet
元素中指定
version=“2.0”
会产生以下错误:

xsl:version: only 1.0 features are supported

我想我可以使用EXSLT中的
节点集
。我不熟悉这一点,但我尝试将有关EXSLT的信息添加到
xsl:stylesheet
元素中。这似乎没有效果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:exsl="http://exslt.org/common"
     extension-element-prefixes="exsl"
     version="1.0">


<强>是否可以在我的情况下使用XSL 2或EXSLT,如何?< /强> < /P> < P> Martin Honnen的建议使我考虑使用XSLTPROC而不是使用Swift的对象(ByApple XSLTSList:参数:)/Clult>方法> < /P> 下面是结果的样子

Swift代码

// Write XML to temporary file
xmlDocument.xmlString.write(to: temporaryXMLFileURL, atomically: false, encoding: String.Encoding.utf8)

// Use xsltproc to apply the XSLT transformation
let task = Process()
task.launchPath = "/usr/bin/xsltproc"
task.arguments = try [xsltFileURL.absoluteString, temporaryXMLFileURL.absoluteString]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let xsltResult = String(data: data, encoding: .utf8)!
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exslt="http://exslt.org/common"
    extension-element-prefixes="exslt"
    version="1.0">

    <xsl:variable name="stuff">
        ...
    </xsl:variable>

    <xsl:for-each select="exslt:node-set($stuff)/stuff">
        ...
    </xsl:for-each>

</xsl:stylesheet>
XSLT代码

// Write XML to temporary file
xmlDocument.xmlString.write(to: temporaryXMLFileURL, atomically: false, encoding: String.Encoding.utf8)

// Use xsltproc to apply the XSLT transformation
let task = Process()
task.launchPath = "/usr/bin/xsltproc"
task.arguments = try [xsltFileURL.absoluteString, temporaryXMLFileURL.absoluteString]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let xsltResult = String(data: data, encoding: .utf8)!
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exslt="http://exslt.org/common"
    extension-element-prefixes="exslt"
    version="1.0">

    <xsl:variable name="stuff">
        ...
    </xsl:variable>

    <xsl:for-each select="exslt:node-set($stuff)/stuff">
        ...
    </xsl:for-each>

</xsl:stylesheet>

...
...

请考虑向我们展示您尝试过的最小但完整的样品。XSLT1.0处理器不支持
exsl:node set
或专有名称空间中的类似函数,这是非常不寻常的。因此,找出Swift使用的XSLT处理器,并有希望找到一种将结果树片段转换为节点集的方法。请尝试运行一个简单的测试用例,如位于的样式表。谢谢。使用链接到的样式表,我看到Swift正在使用libxslt。但是,我无法进一步:我尝试使用
libxslt:
xt:
saxon:
作为
node set
的前缀,如文档所述,但总是得到相同的错误:
xmlXPathCompOpEval:function node set not found
。那么,Swift使用可用的
函数的示例样式表输出了什么呢('exsl:node set')
检查?结果确实表明,Swift使用libxslt时不支持
exsl:node set
。因此,除非您也可以从Swift作为外部程序调用xsltproc/libxslt(支持EXSLT),否则听起来似乎确实无法执行XSLT1.0和
exsl:node set
使用。