我有这个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: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>
包含的文件xinclude-test-included.xml
是
<?xml version="1.0" encoding="utf-8"?>
<xsl:param name="test" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
aaa
</xsl:param>
当我用
评估样式表时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
我期望它打印&#34; aaa&#34;。
但是,如果我使用另一个样式表来加载第一个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中做错了什么?
答案 0 :(得分:3)
我确定你会特别得到关于撒克逊人的答案或评论,但作为对你问题的更一般性回答,
那么我在第一个XSLT中做错了什么?
我发现XSLT 2.0不包含任何要求处理器对样式表文档执行XInclude处理的规定。由于规范定义了样式表文档的形式和语义,我倾向于将该遗漏视为处理器不应对样式表文档执行XInclude处理的指示。是否也未指定document()
函数执行XInclude处理,但我不会以相同的方式将其作为指示。
无论好坏,XSLT都有its own mechanism for including external stylesheet fragments。语义与XInclude略有不同:xsl:include
和xsl:import
用于引入外部样式表模块,而不是任意XML片段。
答案 1 :(得分:1)
文档与代码不匹配,我担心:Saxon不会尝试将-xi选项应用于样式表文档。我们必须决定是否将代码或文档视为正确。