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

如何从根Schematron文件覆盖子Schematron中定义的let变量?

如何通过根Schematron文件覆盖子文件中已定义的let变量?

可以实现这个需求,核心是控制sch:extends和let元素的顺序,同时保证使用的Schematron处理器支持变量覆盖逻辑。

问题分析

你当前的root_schematron.xml写法方向是对的,但要明确:sch:extends会先加载子Schema的全部内容,之后定义的let变量会覆盖子文件中同名的变量。你当前代码里把let放在sch:extends之后,理论上已经能覆盖子文件的type变量,若未生效可优先排查处理器兼容性或变量匹配问题。

正确实现代码

保持let定义在sch:extends之后,确保根文件的变量定义优先级高于子文件:

<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns="http://purl.oclc.org/dsdl/schematron" 
            xmlns:sch="http://purl.oclc.org/dsdl/schematron" >

    <sch:extends href="UBL-TR_Main_Schematron.xml"/>
    <let name="type" value="'earchive'"/>
</sch:schema>

关键注意事项

  • 顺序不可颠倒:如果把let放在sch:extends之前,子文件的let会覆盖根文件的定义,无法达到修改效果。
  • 处理器兼容性:主流Schematron处理器(如Saxon、ISO Schematron Validator)都支持这种变量覆盖逻辑,小众处理器需提前验证。
  • 变量名严格匹配:变量名大小写敏感,必须和子文件中的name属性完全一致。

验证覆盖效果

可以在子文件中临时添加调试规则(测试后可移除),验证type变量是否被替换:

<!-- 在UBL-TR_Main_Schematron.xml中添加 -->
<sch:pattern>
    <sch:rule context="/">
        <sch:report test="true()">当前type变量值:{type}</sch:report>
    </sch:rule>
</sch:pattern>

用root_schematron.xml校验任意XML文件,查看输出是否显示当前type变量值:earchive,以此确认覆盖生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:43:31