如何编写Schematron规则仅对两个SUBTASK间的EFFECT元素触发告警
问题原因
你写的规则存在两处核心逻辑错误:
- XPath选取紧邻同胞、判断节点类型的语法不正确,
preceding-sibling::*[position()[1]][SUBTASK]这类写法无法正确匹配到紧邻的SUBTASK同胞 - 规则触发逻辑不符合Schematron的语法约定:Schematron中
assert节点的test表达式返回false时才会触发告警,且你用=对两个节点做相等判断的逻辑完全不符合需求 - 没有限定「只有前后紧邻同胞都是SUBTASK」才触发的条件,所以所有EFFECT都命中告警
正确实现方案
两种写法可实现需求,选任意一种即可:
写法1:用report元素(逻辑更直观)
report元素的规则是test表达式返回true时触发告警,刚好匹配「满足前后都是SUBTASK就报错」的逻辑:
<rule context="EFFECT"> <report test="preceding-sibling::*[1]/self::SUBTASK and following-sibling::*[1]/self::SUBTASK" role="error" id="error_EFFECT_between_SUBTASK"> EFFECT not allowed between two SUBTASKs </report> </rule>
写法2:用assert元素(和你原有写法习惯一致)
如果要沿用assert,需要把test写为「不满足前后都是SUBTASK的条件」,这样当满足前后都是SUBTASK时test为false,触发告警:
<rule context="EFFECT"> <assert test="not(preceding-sibling::*[1]/self::SUBTASK and following-sibling::*[1]/self::SUBTASK)" role="error" id="error_EFFECT_between_SUBTASK"> EFFECT not allowed between two SUBTASKs </assert> </rule>
规则说明
preceding-sibling::*[1]:选取当前节点的前一个紧邻同胞元素/self::SUBTASK:判断这个紧邻同胞是不是SUBTASK节点- 两个条件同时成立时,才会触发对应的告警,其他位置的EFFECT都不会命中规则
内容的提问来源于stack exchange,提问作者knsclare
相关产品推荐
相关产品推荐

