xml - Saxon 过早评估 xsl :attribute-set

标签 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>使用属性集 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("") 来读取其自己的源代码,在这种情况下,宽松的验证将启动并导致此失败。如果这不是解释,请提供您正在做的事情的更多详细信息。

关于xml - Saxon 过早评估 xsl :attribute-set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493231/

相关文章:

xml - 如何以结构化方式返回 Schematron 验证结果

java - 如何在 java 中运行 saxon xslt 转换

xml - 选择祖先第一个节点的属性值

c# - 是否有用于 XSD 的 XSD,即 Meta-XSD?

foreign-keys - xml 模式中的主键和外键

java - 如何在 Spring Boot Java 中从 xml 获取值?

java - @+id/允许使用哪些特殊字符?

java - 必须在项目中设置 build.dir 错误

xml - 寻找 XSLT 库来创建 SVG 图表

xml - 如何使 XML 模式中的元素可选?