独家 XPath 测试

Exclusive XPath test

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

谢谢!

正如您所暗示的,问题是您在 Schematron 中将此表达为适用于每个 li 元素的规则;而您用英语描述的规则适用于每个 root 元素。

所以你可以表达为

<rule context="root">
  <assert test=".//li[contains(text(),'abc')] or
                not(.//title = 'def')">Report this.</assert>
</rule>

请注意,我已经翻转了测试的意义,以匹配您的英文描述

If no li under root contains "abc" and root contains title, "def" then report.

由于您使用的是 <assert> 元素,因此您断言的内容与您要报告的内容相反。使用 <report> 元素可能更有意义:

<rule context="root">
  <report test="not(.//li[contains(text(),'abc')]) and
                .//title = 'def'">Report this.</report>
</rule>