Schematron检测可选属性存在性及值拼写正确性的实现问询
正确实现Schematron检测可选属性值的方案
核心需求回顾
需要检测XML中SIGNOFF下的ACCOMPBY/INSPBY节点的可选属性QUAL-REQS:
- 仅当属性存在时才进行验证
- 属性值必须严格为
RVSM或LLM,拼写错误需标记
正确的Schematron规则实现
<schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <!-- 仅匹配存在QUAL-REQS属性的目标节点 --> <rule context="SIGNOFF/ACCOMPBY[@QUAL-REQS] | SIGNOFF/INSPBY[@QUAL-REQS]"> <assert test="@QUAL-REQS = ('RVSM', 'LLM')"> 属性QUAL-REQS的值非法,必须为"RVSM"或"LLM",当前值:<value-of select="@QUAL-REQS"/> </assert> </rule> </pattern> </schema>
关键修正点说明
- 精准匹配目标节点:通过
[@QUAL-REQS]限定上下文,只对存在该属性的ACCOMPBY/INSPBY节点触发检测,解决了第二次尝试中“无属性节点也被检测”的问题 - 修正属性名拼写:使用正确的属性名
QUAL-REQS,避免第一次尝试中的拼写错误(原错误为QUALS-REQS) - 严格值校验:通过
@QUAL-REQS = ('RVSM', 'LLM')直接判断属性值是否属于合法集合,非法值会触发明确的错误提示
示例验证效果
针对包含错误值的XML片段:
<SIGNOFF> <ACCOMPBY QUAL-REQS="RVPSM">...</ACCOMPBY> <INSPBY>...</INSPBY> <INSPBY QUAL-REQS="LLM">...</INSPBY> </SIGNOFF>
- 带有错误值
RVPSM的ACCOMPBY节点会被标记错误 - 无
QUAL-REQS属性的INSPBY节点不会触发检测 - 值为
LLM的INSPBY节点验证通过
内容的提问来源于stack exchange,提问作者R.Bowe
相关产品推荐
相关产品推荐

