我正在尝试编写一个Schematron规则来执行以下测试......
如果root下的li不包含“abc”且root包含title,则“def”然后报告。
我遇到的问题是我得到了很多误报。这是我目前的XPath ......
<rule context="li">
<assert test="not(contains(text(),'abc')) and ancestor::root/descendant::title = 'def'">Report this.</assert>
</rule>
我的输出最终会报告不包含“abc”的每个li,我知道这是因为它正在测试每个li和报告。
但是,我不知道如何编写XPath,以便我可以测试任何li是否包含“abc”。
谢谢!
答案 0 :(得分:3)
正如您所暗示的那样,问题在于您在Schematron中表达了这一点,这一规则适用于每个li
元素;而您用英语描述的规则适用于每个root
元素。
所以你可以把它表达为
<rule context="root">
<assert test=".//li[contains(text(),'abc')] or
not(.//title = 'def')">Report this.</assert>
</rule>
请注意,我已经改变了测试的意义,以匹配您的英文说明
如果root下没有li包含&#34; abc&#34;和root包含title,&#34; def&#34;然后报告。
由于您使用的是<assert>
元素,因此您断言与您要报告的内容相反。使用<report>
元素可能更有意义:
<rule context="root">
<report test="not(.//li[contains(text(),'abc')]) and
.//title = 'def'">Report this.</report>
</rule>