14

我正在尝试选择所有具有id="mydiv"但不包括也具有class="exclass". 现在我正在做第一部分//*[@id="mydiv"]。如何添加类排除部分?

PS 如果您想知道为什么我需要选择多个具有相同 id 的元素,我只是在处理我无法控制的现有 DOM。

4

2 回答 2

20

您可以使用否定:

//*[@id="mydiv" and @class!="exclass"]

如果该class属性可能并非在所有节点上都存在,则需要:

//*[@id="mydiv" and (not(@class) or @class!="exclass")]

最后一个(有点)奇怪的逻辑可以变成迈克尔提出的:

//*[@id="mydiv" and not(@class="exclass")]

不过,就个人而言,如果缺少属性,XPath 无法进行比较这一事实感觉有点像缺点。

于 2012-06-20T05:33:01.273 回答
9

书面问题的答案是

//*[@id="mydiv" and not(@class="exclass")]

如果存在@id 属性并且其值为mydiv,则条件的前半部分为真。如果没有值为 exclass 的 @class 属性,则后半部分为真:也就是说,如果没有类属性,或者如果有一个类属性并且它的值不是“exclass”。

在这种情况下避免使用 !=:90% 的情况下,如果你想到写A!=B,你可能想要not(A=B). 在 A 或 B 不是单例的情况下,含义是不同的,也就是说,它要么是空的,要么可以包含多个值。

于 2012-06-20T08:03:08.927 回答