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

Jas*_*son 63 xpath contains

我有一些XML结构如下:

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>
Run Code Online (Sandbox Code Playgroud)

我需要选择一个不包含"商业"类别的每个作品(所以这只是本例中的第一个作品).

xpath有可能吗?我尝试过沿着这些方向努力但却无处可去:

//production[not(contains(category,'business'))]
Run Code Online (Sandbox Code Playgroud)

Arr*_*ran 114

XPath查询区分大小写.看了你的例子(顺便说一句,很棒,没有人似乎再提供例子了!),我只需将"业务"改为"业务"就能得到你想要的结果.

//production[not(contains(category,'Business'))]
Run Code Online (Sandbox Code Playgroud)

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


Lar*_*rsH 25

我需要选择不包含"商业"类别的每个作品

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

//production[category[not(contains(., 'Business'))]]
Run Code Online (Sandbox Code Playgroud)

而不是

//production[not(contains(category, 'Business'))]
Run Code Online (Sandbox Code Playgroud)

后者选择第一个 category孩子不包含"商业"的每个生产.当a production没有category子节点或多个子节点时,两个XPath表达式的行为会有所不同.

只要每个孩子<production>只有一个<category>孩子,就像在简短的XML例子中一样,它在实践中没有任何区别.是否始终可以依赖于是否为真,取决于各种因素,例如您是否具有强制执行该约束的模式.就个人而言,我会选择更强大的选项,因为它不会"花费"太多......假设你在问题中陈述的要求是非常正确的(而不是例如'选择每个没有类别的产品)包含"商业"').


Shu*_*ain 5

您可以使用not(expression)功能

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

例子:

//a[not(contains(@id, 'xx'))]
Run Code Online (Sandbox Code Playgroud)

或者

expression != true()
Run Code Online (Sandbox Code Playgroud)