如何在Swift中使用EXSLT或XSL 2处理XML文档?
我的Swift应用程序生成一个XMLDocument,然后使用XSLT进行转换:如何在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
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的
// 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
使用。