помогите разобраться в XPath - PullRequest
       0

помогите разобраться в XPath

0 голосов
/ 28 сентября 2010

У меня есть такое выражение xpath:

link[@rel='alternate' and @type='text/html' or not(@rel)]/@href | link/text()

На самом деле я не понимаю символ |

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

символ |это союз.Он захватывает все элементы, которые соответствуют либо левой стороне, либо правой стороне.

То, что говорит этот xpath:

  • Получите атрибут href всех тегов ссылки, которые имеют атрибут"rel = alternate" и атрибут "type = text / html", или захватите href всех тегов ссылки, которые не имеют атрибута rel

Также захватите (из-за объединения):

  • Захватить внутренний текст всех тегов ссылок на странице.

Вид странного XPath, но это то, что он делает.

0 голосов
/ 29 сентября 2010

На самом деле я не понимаю символ |

Это оператор объединения XPath .

Как определено в W3 XPath 2.0 Spec .:

• Союз и | операторы эквивалент. Они берут два узла последовательности в качестве операндов и возвращают последовательность, содержащая все узлы, которые встречаются в любом из операндов.

Конечно, оператор "union" (английское слово) был добавлен только в XPath 2.0, а в XPath 1.0 у нас есть только более ранний синоним, представленный символом |.

Итак, в частном случае :

link[@rel='alternate' and @type='text/html' or not(@rel)]/@href | link/text()

Вышеупомянутое выражение XPath выбирает объединение двух множеств :

  1. Все узлы выбраны: link[@rel='alternate' and @type='text/html' or not(@rel)]/@href

  2. Все узлы, выбранные: link/text()

Объединение - это стандартная операция в теории множеств (и в математике), хотя знак «U» используется для обозначения объединения там.

Цитировать определение из Википедия :

Объединение двух множеств A и B является коллекция точек, которые находятся в или в B (или в обоих):

Простой пример :

A = {1,2,3,4,5,6}

B = {1,5,6,7,8}


A U B = {1,2,3,4,5,6,7,8}
0 голосов
/ 28 сентября 2010

Канал (|) в XPath объединяет выражения. Таким образом, он вернет атрибут href для элементов ссылок (которые соответствуют предикату) и текстовое содержимое любых ссылок

Итак, данный фрагмент похож на

  <link>test</link>
  <link href="http://www.google.com">Google</link>
  <link rel="zzzz" href="http://www.stackoverflow.com">Stack Overflow</link>

вы получите:

test
http://www.google.com
Google
Stack Overflow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...