独家XPath测试

时间:2015-08-04 20:52:33

标签: xpath schematron

我正在尝试编写一个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”。

谢谢!

1 个答案:

答案 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>