如何构造一个xpath来选择不包含字符串的项目

Dan*_*nny 10 xpath

我如何使用类似于下面示例的内容,但结果相反,即(default)文本中不包含的项目.

<test>
     <item>Some text (default)</item>
     <item>Some more text</item>
     <item>Even more text</item>
</test>
Run Code Online (Sandbox Code Playgroud)

鉴于这种

//test/item[contains(text(), '(default)')]
Run Code Online (Sandbox Code Playgroud)

会返回第一个项目.是否有一个我可以使用的运算符包含?

Tom*_*lak 18

就在这里:

//test/item[not(contains(text(), '(default)'))]

提示:not()是XPath中的函数而不是运算符.


另一种可能更好的表达方式是:

//test/item[not(text()[contains(., '(default)')])]

两个表达式之间存在微妙但重要的区别(让我们分别称它们为A和B).

简单情况:如果所有<item>只有一个文本节点子节点,则A和B的行为相同.

复杂情况:如果<item>可以有多个文本节点子节点,则表达式A仅'(default)'在第一个节点中出现时匹配.

这是因为text()匹配所有文本节点子节点并生成节点集.到目前为止并不奇怪.现在,contains()接受一个节点集作为它的第一个参数,但它需要将它转换为字符串来完成它的工作.从node-set到string的转换只产生集合中第一个节点的字符串值,忽略所有其他节点(试着string(//item)看看我的意思).在简单的情况下,这恰好也会发生,但结果并不令人惊讶.

表达式B通过单独显式检查每个文本节点而不是仅检查整个<item>元素的字符串值来处理此问题.因此,两者中的稳健性更强.