我有一些XML结构如下:
<whatson>
<productions>
<production>
<category>Film</category>
</production>
<production>
<category>Business</category>
</production>
<production>
<category>Business training</category>
</production>
</productions>
</whatson>
我需要选择一个类别并不包含&#34; Business&#34; (所以这只是本例中的第一个作品)。
xpath有可能吗?我尝试过沿着这些方向努力但却无处可去:
//production[not(contains(category,'business'))]
答案 0 :(得分:105)
XPath查询区分大小写。看了你的例子(顺便说一句,很棒,没有人似乎再提供例子了!),我只需将“业务”改为“业务”即可得到你想要的结果
//production[not(contains(category,'Business'))]
我已经通过在Chrome中打开XML文件并使用开发人员工具执行XPath查询来测试了这一点,它只给了我电影类别。
答案 1 :(得分:25)
我需要选择不包含“商业”
类别的每个作品
虽然我赞成@Arran的回答是正确的,但我也会加上这个...... 严格解释,OP的规范将实现为
//production[category[not(contains(., 'Business'))]]
而不是
//production[not(contains(category, 'Business'))]
后者选择第一个 category
孩子不包含“商家”的所有作品。当production
没有category
个子项或多个子项时,两个XPath表达式的行为会有所不同。
只要每个<production>
只有一个<category>
子项,在实践中没有任何区别,就像在简短的XML示例中一样。是否始终可以依赖于是否为真,取决于各种因素,例如您是否具有强制执行该约束的模式。就个人而言,我会选择更强大的选项,因为它不会“花费”太多......假设你在问题中陈述的要求是非常正确的(而不是例如'选择每个没有类别的产品)包含“商业”')。
答案 2 :(得分:1)
您可以使用not(expression)
功能
not()
是xpath中的函数(与运算符相对)
示例:
//a[not(contains(@id, 'xx'))]
OR
expression != true()
答案 3 :(得分:0)
应该// production [not(contains(category,'business'))]