如何从根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
相关产品推荐
相关产品推荐

