My Swift应用程序生成一个XMLDocument,然后使用XSLT进行转换:
xmlDocument.object(byApplyingXSLTString: xsltString, arguments: nil)
在我的XSLT样式表(xsltString
)中,我想使用XPath访问结果树片段。 XSLT 1.0不支持此功能;我尝试使用XSLT 2.0,但它似乎并不受Swift支持;在version="2.0"
元素中指定xsl:stylesheet
会产生此错误:
xsl:version: only 1.0 features are supported
我想我可以使用EXSLT中的node-set
。我对此并不熟悉,但我尝试将有关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">
我收到以下错误:
xmlXPathCompOpEval: function node-set not found
XPath error : Unregistered function
在我的情况下可以使用XSL 2.0或EXSLT吗?
答案 0 :(得分:1)
Martin Honnen的建议让我考虑使用xsltproc而不是使用Swift的object(byApplyingXSLTString:arguments:)
方法。
这是结果的样子。
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)!
XSLT代码
<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>