如何在Swift中使用EXSLT或XSL 2处理XMLDocument?

时间:2017-02-11 14:13:02

标签: xml swift exslt

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吗?

1 个答案:

答案 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>