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

144

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

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

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

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

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

Ответы:

219

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

Версия 1:

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

Версия 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stephan
источник
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]

azurkin
источник
на самом деле (и )[1]означает выбрать только один из двух?!?!
старик
@Anthony Да, он выберет один из двух, если оба узла существуют, или выберет единственный, который существует.
Азуркин
хорошо, я неверно истолковал ваше заявление. он работает как любой другой оператор "или", так что если первое условие возвращает true, то второе игнорируется, да?
старик
@ Энтони Нет. Здесь нет условий. Есть узлы. И "|" - оператор объединения узлов. Он создает набор узлов из указанных путей и не гарантирует порядок узлов. Если узел с указанным путем не существует, он просто отсутствует в наборе узлов. Затем конструкция «[1]» получает первый узел из набора узлов.
Азуркин
моя точка зрения заключается в том, что он функционирует аналогично orили в других языках |оператора, так что если бы оба узла существовали, он всегда возвращал первый узел?
старик
3

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

xpath1 | xpath2

Например:

//input[@name="username"] | //input[@id="wm_login-username"]
Субрахманья Прасад
источник