You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Saxon提前评估xsl:attribute-set引发验证报错问题咨询

问题分析与解决方案

首先,我们来拆解你遇到的问题根源:

1. 核心差异:-sa vs -val:lax的处理逻辑

你提到-sa参数执行正常,而-val:lax触发FORG0001错误,本质是两个参数的作用机制完全不同:

  • -sa(Schema-Aware XSLT):启用这个参数时,Saxon会完全理解XSLT的专用语法——它知道xsl:use-attribute-sets是XSLT的指令,不是最终输出元素的属性。处理流程是:先解析并执行xsl:use-attribute-sets,将属性集里的属性应用到<SWBML>元素上,同时移除xsl:use-attribute-sets本身,之后再对最终生成的输出文档进行schema验证。这时候输出里的<SWBML>已经符合你的业务schema,自然不会报错。
  • -val:lax(Lax Validation):这个参数的设计目标是对输入XML文档进行宽松验证,但当你同时导入了业务schema并启用schema-aware处理时,Saxon会错误地将样式表中的结果元素构造(比如带xsl:use-attribute-sets的<SWBML>)当成了要验证的实例文档片段。由于你的业务schema里的<SWBML>元素并没有定义xsl:use-attribute-sets这个XSLT命名空间的属性,所以验证器抛出了“属性不允许”的错误。

2. 这是XSLT限制还是Saxon bug?

这不是XSLT的固有限制,而是Saxon对-val参数的处理逻辑导致的场景冲突:-val参数默认会对所有被解析的XML文档(包括样式表)应用验证,但样式表应该遵循XSLT的schema,而非你的业务schema。这种情况下,业务schema无法识别XSLT专用属性,就会触发错误。

3. 可行的解决方案

方案一:用xsl:output控制输出验证,而非-val参数

如果你需要对输出文档进行lax验证,直接在样式表中通过xsl:output指定,配合-sa参数即可:

<xsl:output method="xml" validation="lax"/>

执行命令时只需用-sa:

java -jar saxon9ee.jar -sa -xsl:your-stylesheet.xsl -s:input.xml -o:output.xml

这样Saxon会先处理XSLT指令,再对最终输出进行lax验证,完全符合你的预期。

方案二:限制-val:lax的作用范围到输入文档

如果你确实需要对输入文档进行lax验证,同时启用schema-aware处理,可以通过Saxon的更精细参数来控制:

java -jar saxon9ee.jar -sa -xsl:your-stylesheet.xsl -s:input.xml -val:lax -o:output.xml

这里要确保你的样式表中xsl:import-schema只针对输入/输出的目标命名空间,Saxon会自动区分样式表的XSLT语法和业务schema的验证范围。如果还是报错,可以尝试添加-noval:xsl参数来排除对样式表的验证:

java -jar saxon9ee.jar -sa -xsl:your-stylesheet.xsl -s:input.xml -val:lax -noval:xsl -o:output.xml

方案三:显式声明XSLT命名空间的属性允许性(不推荐)

如果一定要保留-val:lax参数,也可以修改你的业务schema,添加对XSLT命名空间属性的通配允许:

<xs:element name="SWBML">
  <!-- 原有元素定义 -->
  <xs:anyAttribute namespace="http://www.w3.org/1999/XSL/Transform" processContents="skip"/>
</xs:element>

但这种方式会污染业务schema,不建议长期使用,仅作为临时 workaround。

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:02