如何用document()遍历特定名称元素?XSLT图表索引生成遇阻
我之前也踩过macOS旧版xsltproc搭配document()函数的坑,结合你描述的情况——已经进入for-each select="ns:document"代码块,且--load-trace确认文件已找到,但仍有异常——咱们可以从这几个方向逐一排查:
命名空间绑定是否完整
你用到了ns:document前缀,那通过document($file-path)加载的外部文档,其内部节点的命名空间是否在样式表中正确声明?旧版xsltproc对命名空间的校验很严格,比如如果外部文档的图表节点是<ns:chart>,你必须确保样式表顶部已经声明了对应的命名空间:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns="http://your-namespace-uri-here">同时在访问外部文档节点时,必须带上前缀,比如
document($file-path)/ns:charts/ns:chart,不能省略前缀直接写chart。路径解析的隐性问题
虽然--load-trace显示文件已找到,但旧版xsltproc对相对路径的处理可能和预期不符,比如当前工作目录不是你以为的目录,或者路径包含空格、特殊字符。建议先把$file-path换成绝对路径测试,比如:<xsl:variable name="file-path" select="'/Users/yourname/Desktop/target.xml'" />排除路径解析的干扰。
文档节点的访问方式
document()函数返回的是文档节点,不是直接的元素节点。旧版处理器可能需要你明确从文档节点开始导航,比如如果外部文档的根元素是<ns:chart-collection>,你应该写:<xsl:for-each select="document($file-path)/ns:chart-collection/ns:chart"> <!-- 处理每个chart节点 --> </xsl:for-each>而不是直接尝试选择
document($file-path)/ns:chart。文件权限与系统沙箱限制
macOS的旧版工具可能对某些目录(比如iCloud同步目录、受系统保护的目录)的读取权限处理有问题,即使--load-trace显示找到文件,也可能无法读取内容。建议把测试文件移到桌面这类权限宽松的目录再试。xsltproc版本的特性限制
High Sierra预装的xsltproc基于libxslt 1.1.28,完全不支持XSLT 2.0特性。如果你的样式表用了2.0的语法(比如序列、for-each-group、更复杂的函数),必然会出现异常。这种情况下要么修改样式表适配XSLT 1.0,要么通过Homebrew升级libxslt到最新版本:brew install libxslt
内容的提问来源于stack exchange,提问作者zneak

