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