我正在尝试选择所有具有id="mydiv"
但不包括也具有class="exclass"
. 现在我正在做第一部分//*[@id="mydiv"]
。如何添加类排除部分?
PS 如果您想知道为什么我需要选择多个具有相同 id 的元素,我只是在处理我无法控制的现有 DOM。
我正在尝试选择所有具有id="mydiv"
但不包括也具有class="exclass"
. 现在我正在做第一部分//*[@id="mydiv"]
。如何添加类排除部分?
PS 如果您想知道为什么我需要选择多个具有相同 id 的元素,我只是在处理我无法控制的现有 DOM。
您可以使用否定:
//*[@id="mydiv" and @class!="exclass"]
如果该class
属性可能并非在所有节点上都存在,则需要:
//*[@id="mydiv" and (not(@class) or @class!="exclass")]
最后一个(有点)奇怪的逻辑可以变成迈克尔提出的:
//*[@id="mydiv" and not(@class="exclass")]
不过,就个人而言,如果缺少属性,XPath 无法进行比较这一事实感觉有点像缺点。
书面问题的答案是
//*[@id="mydiv" and not(@class="exclass")]
如果存在@id 属性并且其值为mydiv,则条件的前半部分为真。如果没有值为 exclass 的 @class 属性,则后半部分为真:也就是说,如果没有类属性,或者如果有一个类属性并且它的值不是“exclass”。
在这种情况下避免使用 !=:90% 的情况下,如果你想到写A!=B
,你可能想要not(A=B)
. 在 A 或 B 不是单例的情况下,含义是不同的,也就是说,它要么是空的,要么可以包含多个值。