Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 不跟撒克逊人合作?_Xml_Xslt_Saxon_Xinclude - Fatal编程技术网

Xml 不跟撒克逊人合作?

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

我有这个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>
当我使用

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>