Saxon 过早地评估 xsl:attribute-set

Saxon Prematurely Evalutes xsl:attribute-set

这与使用最新的 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> 使用属性集 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 处理中的错误?感觉应该可以这样对我!

有什么想法吗?

我没能重现这个。

我运行这个样式表:

<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("") 来读取它自己的源代码,在这种情况下,松散的验证将启动并导致此失败。如果这不是解释,请提供更多详细信息,具体说明您在做什么。