我如何使用类似于下面示例的内容,但结果相反,即(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>
元素的字符串值来处理此问题.因此,两者中的稳健性更强.
归档时间: |
|
查看次数: |
15817 次 |
最近记录: |