2012-06-13 98 views
42

我有一些的XML的结构是这样的:如何在xpath中使用不包含()?

<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'))] 

回答

79

XPath查询区分大小写。说完看着你的榜样(其中,顺便说一句,是真棒,似乎没有人提供的例子了!),我就可以通过改变“业务”得到的结果,你想,以“商务”

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

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

24

我需要选择一个类别每一个生产虽然我upvoted @艾伦的答案是正确的,不包含“业务”

,我也想补充一点...... 严格解释,任择议定书的规范将被实现为

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

而不是

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

后者选择每个生产其第一个category孩子不包含“业务”。当production没有category孩子或两个以上孩子时,两个XPath表达式的行为会有所不同。

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

+0

@LoamyHound:谢谢为更正!我终于看到了你的答案,并在2年后修复了缺失的支架。 – LarsH

1

可以使用not(expression)功能

not()在XPath中函数(相对于操作者)

实施例:

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

OR

expression != true()