如何在xpath中使用不包含()?

我有一些这样构造的XML:

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

而且我需要select一个不包含“Business”的类别(这个例子中的第一个生产)。

这可能与xpath? 我试图沿着这些线路工作,但无处可去:

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

XPath查询区分大小写。 看了你的例子(顺便说一下,这真是太棒了,似乎没有人再提供例子了!),我可以通过改变“业务”的方式来得到你想要的结果,

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

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

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

尽pipe我赞同艾伦的回答是正确的,但是我也会加上这个…严格的解释,OP的规范将被实现为

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

而不是

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

后者select每个生产的第一 category儿童不包含“商业”。 当一个production没有category孩子,或者不止一个孩子时,两个XPathexpression式的行为会有所不同。

只要每个<production>只有一个<category>子元素,在实践中就没有什么区别,就像在你简短的例子XML中一样。 无论你是否总能指望是否真实,取决于各种因素,比如你是否有一个强制执行这个约束的模式。 就个人而言,我会select更强大的select,因为它不会“花费”太多……假设您在问题中提到的要求是真的正确的(相对于例如“select每个没有类别的生产包含“业务”)。

你可以使用not(expression)function

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

例:

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

要么

 expression != true()