84

我有一些结构如下的 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'))]
4

4 回答 4

153

XPath 查询区分大小写。看过您的示例(顺便说一句,这很棒,似乎没有人再提供示例了!),我可以通过将“业务”更改为“业务”来获得您想要的结果

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

我已经通过在 Chrome 中打开 XML 文件并使用开发工具执行 XPath 查询来测试这一点,它只给了我电影类别。

于 2012-06-13T22:18:32.863 回答
27

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

虽然我赞成@Arran 的回答是正确的,但我也会添加这个......严格解释,OP 的规范将被实现为

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

而不是

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

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

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

于 2012-06-14T04:25:53.620 回答
6

你可以使用not(expression)函数

not()是 xpath 中的一个函数(与运算符相反)

例子:

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

或者

expression != true()
于 2017-10-23T10:04:49.013 回答
1

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

于 2018-08-19T18:02:38.290 回答