独家 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>
我正在尝试编写 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>