代码之家  ›  专栏  ›  技术社区  ›  Jeff

独占XPath测试

  •  1
  • Jeff  · 技术社区  · 9 年前

    我正在尝试编写Schematron规则来执行以下测试。。。

    如果根目录下没有li包含“abc”,而根目录包含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 回复  |  直到 9 年前
        1
  •  3
  •   LarsH    9 年前

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

    所以你可以用

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

    注意,我已经翻转了测试的意义,以符合您的英语描述

    如果根目录下没有li包含“abc”,而根目录包含title,则报告“def”。

    因为你使用了 <assert> 元素,则断言与要报告的内容相反。使用 <report> 元素:

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