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