Saxon过早地评估xsl:attribute-set

时间:2018-05-23 16:25:20

标签: xml xslt xsd saxon xslt-3.0

这涉及使用最新的Saxon EE 9.8进行XSLT转换的输入的模式感知验证。

我的XSLT文件包含以下内容。

如此定义的命名空间和关联模式:

<xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2" schema-location="/path/to/some_swbml.xsd"/>

符合上述架构的结果文件:

<xsl:result-document method="xml" href="{$file}" format="swbml-format" validation="strict">
    <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
    </SWBML>
 </xsl:result-document>

您会注意到结果文档<SWBML>中的父标记使用的是attrribute集xsl:use-attribute-sets="ir"

属性集定义如下:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:attribute-set name="ir">
        <xsl:attribute name="version">4-2</xsl:attribute>
    </xsl:attribute-set>
</xsl:stylesheet>

这是一个玩具示例,上面的样板是不合理的!

当我使用它时,这可以正常工作:

 java net.sf.saxon.Transform -sa -ext:on -it -o:output.xml -xsl:example.xslt

这是预期的,因为“-sa”只会检查输出的XML文档,正如我所理解的那样。

这不起作用:

java net.sf.saxon.Transform -val:lax -ext:on -it -o:output.xml -xsl:example.xslt

,并提供:

FORG0001: Attribute @xsl:use-attribute-sets is not allowed on element <SWBML>

我的问题是 - 在尝试验证<SWBML>之前,验证者是否应该处理属性集?在我看来,它抱怨输出XML文档中不允许使用XSLT指令,这当然是正确的,但它似乎过早地进行了检查。

生成的XML有效:

<SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" version="4_2">

通过使用“-sa”选项进行转换来证明。

我不确定这是XSLT的限制,还是Saxon处理中的错误?感觉我应该能够对我这样做!

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我还没有能够重现这一点。

我运行了这个样式表:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  version="3.0">

  <xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2">
    <xs:schema targetNamespace="http://www.fpml.org/2005/FpML-4-2">
      <xs:element name="SWBML">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="version" type="xs:decimal"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:template name="xsl:initial-template">
    <xsl:result-document method="xml" validation="strict">
      <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
      </SWBML>
    </xsl:result-document>
  </xsl:template> 

    <xsl:attribute-set name="ir">
      <xsl:attribute name="version">4.2</xsl:attribute>
    </xsl:attribute-set>


</xsl:transform>

使用命令行选项:

-xsl:test.xsl -sa -val:lax -it -t

它运行正常。

在我看来,好像由于某种原因你正在验证样式表本身。也许样式表使用构造document("")来读取自己的源代码,在这种情况下,松弛验证将启动并导致此失败。如果不是解释,请详细说明您正在做什么。