代码之家  ›  专栏  ›  技术社区  ›  Phil

Saxon过早地评估xsl:attribute集

  •  2
  • Phil  · 技术社区  · 6 年前

    这涉及到使用最新的SAXONEE9.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处理中的错误?我觉得我应该能做到!

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Michael Kay    6 年前

    我没能复制这个。

    我运行了这个样式表:

    <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("") 要读取自己的源代码,在这种情况下,不严格的验证将导致失败。如果这不是解释,请详细说明你正在做什么。