Оператор XPath OR для разных узлов


144

Как я могу сделать с XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

Просто //titleне сработает, потому что у меня тоже есть//bookstore/magazine/title

PS Я видел много или примеров, но в основном с атрибутами или структурой одного узла.


5
ИЛИ включает обе стороны. То, что вы ищете, это оператор XOR. Вы смешиваете английское использование слова ИЛИ с логическими операторами.
Зоран Павлович

10
В данном случае это не имеет значения , используется ли вы или или исключающее , как это не возможно , чтобы соответствовать обеим сторонам.
Дэн Халм

Ответы:


219

Все titleузлы с zipcodeили bookузел в качестве родителя:

Версия 1:

//title[parent::zipcode|parent::book]

Версия 2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
"|" на самом деле не является оператором «ИЛИ» в XPath. Он позволяет вам создавать набор узлов, состоящий из поддеревьев целого дерева XML. «// book | // cd» означает, что среди всех дочерних узлов и потомков корневого узла найти все с именем «book», а затем найти также все с именем «cd». Если в потомке корневого узла есть только книжные узлы, ваш набор узлов будет содержать только книжные узлы. Если в потомке корневого узла есть только узлы CD, ваш набор узлов будет содержать только узлы CD. Если в нисходящем порядке корневого узла есть оба узла book и cd, ваш набор узлов будет содержать оба узла book и cd.
Стефан

1
Да я понял что такое "|" Оператор Мой начальный вопрос об операторе ИЛИ. Таким образом, если есть книги и компакт-диски, он найдет только книги, если нет книг, а только компакт-диски, он найдет компакт-диски.
user569008


1
Итак, нет ответа на мой вопрос / нет оператора OR в XPath для узлов?
user569008

3
Логические операторы (OR, XOR и AND) одинаковы в каждом языке программирования, но естественный язык интерпретирует их немного по-разному. Лучше всего устранить двусмысленность при обсуждении вопросов, связанных с ними. Более того, в XPath лучше не думать о вашем результате как о a или b , а о том, что он может быть расположен с помощью a или b . Логически orозначает, что это может быть найдено a or b or both. Логическое xor(исключительное ИЛИ) означает, что оно может быть найдено с помощью either a or b, but not both. Логически andозначает, что это может быть найдено both a and b.
neXus

52

Если вы хотите выбрать только один из двух узлов с оператором объединения, вы можете использовать это решение: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


на самом деле (и )[1]означает выбрать только один из двух?!?!
старик

@Anthony Да, он выберет один из двух, если оба узла существуют, или выберет единственный, который существует.
Азуркин

хорошо, я неверно истолковал ваше заявление. он работает как любой другой оператор "или", так что если первое условие возвращает true, то второе игнорируется, да?
старик

@ Энтони Нет. Здесь нет условий. Есть узлы. И "|" - оператор объединения узлов. Он создает набор узлов из указанных путей и не гарантирует порядок узлов. Если узел с указанным путем не существует, он просто отсутствует в наборе узлов. Затем конструкция «[1]» получает первый узел из набора узлов.
Азуркин

моя точка зрения заключается в том, что он функционирует аналогично orили в других языках |оператора, так что если бы оба узла существовали, он всегда возвращал первый узел?
старик

3

Это элемент имеет два xpath. Затем вы можете написать два xpath, как показано ниже:

xpath1 | xpath2

Например:

//input[@name="username"] | //input[@id="wm_login-username"]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.