xpath以排除具有类的元素

时间:2012-06-20 05:18:54

标签: php dom xpath domdocument

我正在尝试选择具有id="mydiv"的所有dom元素,但不包括那些也包含class="exclass"的元素。现在我正在做第一部分//*[@id="mydiv"]。如何添加课程排除部分?

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

2 个答案:

答案 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不是单身的情况下,即它是空的,或者可以包含多个值的情况下,含义是不同的。