Xml 不跟撒克逊人合作?
我有这个XSLT样式表Xml 不跟撒克逊人合作?,xml,xslt,saxon,xinclude,Xml,Xslt,Saxon,Xinclude,我有这个XSLT样式表xinclude test.xsl: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude"> <xsl:outp
xinclude test.xsl
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xi="http://www.w3.org/2001/XInclude">
<xsl:output method="text"/>
<xi:include href="xinclude-test-included.xml"/>
<!-- <xsl:param name="test"> -->
<!-- aaa -->
<!-- </xsl:param> -->
<xsl:template name="main">
<xsl:value-of select="$test"/>
</xsl:template>
</xsl:stylesheet>
当我使用
saxon -xi -xsl:xinclude-test.xsl -it:main -t
它打印
Saxon-HE 9.8.0.1J from Saxonica
Java version 1.8.0_31
Static error at char 5 in xsl:value-of/@select on line 13 column 35 of xinclude-test.xsl:
XPST0008: Variable test has not been declared (or its declaration is not in scope)
Errors were reported during stylesheet compilation
我希望它打印“aaa”
但是,如果我使用另一个样式表加载第一个XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template name="main">
<xsl:copy-of select="document('xinclude-test.xsl')"/>
</xsl:template>
</xsl:stylesheet>
它正确地执行XInclude处理
那么,我在第一个XSLT中做错了什么呢?我相信您会得到关于Saxon的答案或评论,但作为对您问题的更一般的回答 那么,我在第一个XSLT中做错了什么 我将注意到XSLT2.0不包含任何要求处理者对样式表文档执行XInclude处理的规定。由于规范定义了样式表文档的形式和语义,我倾向于将这种省略视为处理器不应该对样式表文档执行XInclude处理的指示。
document()
函数是否执行XInclude处理也没有指定,但我不认为这是以同样的方式表示的
不管是好是坏,XSLT已经成功了。语义与XInclude有点不同:
xsl:include
和xsl:import
用于引入外部样式表模块,而不是任意的XML片段。我肯定您会得到关于Saxon的答案或评论,但作为对您问题的更一般的回答
那么,我在第一个XSLT中做错了什么
我将注意到XSLT2.0不包含任何要求处理者对样式表文档执行XInclude处理的规定。由于规范定义了样式表文档的形式和语义,我倾向于将这种省略视为处理器不应该对样式表文档执行XInclude处理的指示。document()
函数是否执行XInclude处理也没有指定,但我不认为这是以同样的方式表示的
不管是好是坏,XSLT已经成功了。语义与XInclude有点不同:
xsl:include
和xsl:import
用于引入外部样式表模块,而不是任意的XML片段。文档与代码不匹配,我担心:Saxon没有尝试对样式表文档应用-xi选项。我们必须决定是否正确对待代码或文档
此处作为错误提出:文档与代码不匹配,我担心:Saxon没有尝试将-xi选项应用于样式表文档。我们必须决定是否正确对待代码或文档
此处作为错误提出:考虑将
-t
添加到您的Saxon调用中,然后向我们确切显示您使用的Saxon版本。@MartinHonnen添加了版本信息。中Saxon 9.8的文档说明“-xi:(开|关)将XInclude处理应用于所有输入XML文档(包括架构和样式表模块以及源文档)”因此,我首先建议尝试-xi:on
而不是-xi
。如果这不起作用,那么我想你将不得不等待迈克尔·凯说的话。我尝试了-xi:on
和-xi
,结果相同。约翰·布林格的回答使我想到,席克逊只对文档进行XCube处理,而不是在样式表上。考虑将代码> >代码>代码,然后向我们展示您使用的是哪一种版本的SAXON。@ MartinHonnen添加了版本信息。将XInclude处理应用于所有输入XML文档(包括模式和样式表模块以及源文档)”,因此我建议首先尝试-xi:on
而不是-xi
。如果这不起作用,那么我想你将不得不等待迈克尔·凯说的话。我尝试了-xi:on
和-xi
,结果相同。John Bollinger的回答让我想到Saxon只对正在转换的文档进行xinclude处理,而不是样式表。我明白了。这很有帮助。谢谢第3节开头的注释不鼓励这种解释:“样式表模块由XDM元素节点表示。。。尽管样式表模块通常以符合XML 1.0或XML 1.1的文档形式进行维护,但本规范并不强制要求这样的表示。与源代码树一样,从文本XML或其他方式构造样式表模块的方式超出了本规范的范围。”(而IIRC,XInclude用于组装样式表模块的潜在用途是这条规则背后的动机之一。)我明白了。这非常有用。谢谢!第3节开头的注释不鼓励这样的解释:“样式表模块由XDM元素节点表示。。。尽管样式表模块通常以符合XML 1.0或XML 1.1的文档形式进行维护,但本规范并不强制要求这样的表示。与源代码树一样,从文本XML或其他方式构造样式表模块的方式超出了本规范的范围。”(而IIRC,XInclude用于组装样式表模块的潜在用途是这条规则背后的动机之一。)在我的回答中,我认为XSLT2.0建议中没有提到XInclude处理,这表明不应该在样式表文档上执行这种处理在规范中,处理器不得使用这些元素生成与忽略它们时不同的结果树。在我的回答中,我认为XSLT 2.0建议中没有提及XInclude处理应该被视为这样的处理应该被忽略
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template name="main">
<xsl:copy-of select="document('xinclude-test.xsl')"/>
</xsl:template>
</xsl:stylesheet>