2012-06-20 2 views
11

Я пытаюсь выбрать все элементы dom, которые имеют id="mydiv", но исключают те, которые также имеют class="exclass". Сейчас я делаю первую часть //*[@id="mydiv"]. Как добавить часть исключения класса?xpath исключить элементы, которые имеют класс

P.S. Если вам интересно, почему мне нужно выбрать несколько элементов с одинаковым идентификатором, я просто работаю над существующим DOM, который я не могу контролировать.

+0

У вас есть несколько элементов с одинаковым идентификатором? Знаешь, это не здорово. http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

ответ

17

Вы можете использовать отрицание:

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

Если атрибут class не может существовать на все узлы, вам это нужно:

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

Последней (несколько) нечетная логика может быть превращен в то, что Майкл предложил:

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

Хотя, лично тот факт, что XPath не может сделать сравнение если атрибут отсутствует, это немного напоминает недостаток.

+0

Это не совсем то, что - спросил пользователь. Downvoting. См. Мой ответ. –

+0

@MichaelKay Спасибо, что указали это, я обновил свой ответ; как упоминалось в моем обновлении, я чувствую, что наличие «ничего не может сравниться ни с чем» - это скорее недостаток xpath; просто не могу думать о какой-либо причине, почему это поведение было бы полезно:/ –

5

Ответ на вопрос, как написано в

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

Первая половина условие истинно, если есть @id атрибут и его значение mydiv. Вторая половина имеет значение true, если нет атрибута @class со значением exclass: то есть, если атрибут класса отсутствует, или есть атрибут класса, а его значение является чем-то иным, чем «exclass».

Избегайте использования! = В этой ситуации: 90% времени, если вы думаете о написании A=B, возможно, вы хотели not(A=B). Значение отличается в том случае, когда либо A, либо B не является одиночным, то есть там, где он либо пуст, либо может содержать несколько значений.

+0

Правила TriXPath (как в трюках)! – jolt

Смежные вопросы