gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 15:52:03 24 4
gpt4 key购买 nike

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

xmlDocument.object(byApplyingXSLTString: xsltString, arguments: nil)

在我的 XSLT 样式表 (xsltString) 中,我想使用 XPath 访问结果树片段。这在 XSLT 1.0 中不受支持;我尝试使用 XSLT 2.0,但 Swift 似乎不支持它;在 xsl:stylesheet 元素中指定 version="2.0" 会产生此错误:

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,如何使用?

最佳答案

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>

关于xml - 如何在 Swift 中使用 EXSLT 或 XSL 2 处理 XMLDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42176864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com