如何在xpath中使用not contains()?


72

我有一些这样的XML:

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

而且我需要选择每个类别都不包含“业务”的产品(在此示例中仅选择第一个产品)。

xpath有可能吗?我尝试按照这些思路工作,但无济于事:

//production[not(contains(category,'business'))]

Answers:


135

XPath查询区分大小写。看完您的示例(顺便说一下,它真棒,似乎没人提供示例了!),只需将“业务”更改为“业务”,就可以得到您想要的结果

//production[not(contains(category,'Business'))]

我已经通过在Chrome中打开XML文件并使用开发人员工具执行该XPath查询进行了测试,它还给了我Film类。


感谢您提出在Chrome中打开XML并使用开发人员工具验证XPath是否有效的建议!我只是想找到一个在线检查器,所以您的建议要简单得多。
Igor Maximov

您可以只使用// production [not(@ category ='Business')]而不使用包含项吗?
Yi Xiang Chong

@YiXiangChong当然,如果您不想进行包含搜索,但是此原始帖子正在执行包含搜索(因为并非所有元素都明确地等于“ Business”)
Arran

27

我需要选择不包含“业务”类别的每个产品

尽管我认为@Arran的答案是正确的,但我还要添加它...严格解释,OP的规范将实现为

//production[category[not(contains(., 'Business'))]]

而不是

//production[not(contains(category, 'Business'))]

后者选择第一个 category不包含“业务”的每个产品。当aproduction没有category子项或多于一个时,两个XPath表达式的行为将不同。

只要每个人<production>都只有一个<category>孩子,就在实践中没有任何区别,就像您的简短示例XML一样。是否始终可以依靠真实性取决于各种因素,例如您是否具有实施该约束的方案。就我个人而言,我会选择更强大的选项,因为它不会“花费”太多...假设问题中所述的要求是正确的(例如,例如“选择没有类别的每个产品”包含“业务””)。


@LoamyHound:感谢您的指正!两年后,我终于看到了您的答案,并修复了缺失的括号。
LarsH

3

您可以使用not(expression)功能

not() 是xpath中的函数(相对于运算符)

例:

//a[not(contains(@id, 'xx'))]

要么

expression != true()

0

应该是带有not contains()方法的xpath, //production[not(contains(category,'business'))]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.