2013-12-22 3 views
1

Предположим, у меня есть два выражения: //div[@class="foo"] и //span[@class="foo"]. Можно ли «объединить» их, например, так:Наборы узлов комбинирования XPath

//(div | span)[@class="foo"] 

Или я могу только взять объединение двух полных выражений?

//div[@class="foo"] | //span[@class="foo"] 

ответ

2

Более идиоматическое (и я осмелюсь сказать, читаемым) способ получить все div и span элементов, имеющих class="foo" это:

//*[(self::div or self::span) and @class="foo"] 

На английском языке:

Выберите все элементы, сами являются div или span и имеют атрибут класса, значение которого «foo»

As для первоначального вопроса, следующие выражения возвращают одинаковые результаты:

  1. (//div | //span)[@class="foo"]
  2. //div[@class="foo"] | //span[@class="foo"]

Первый дает множество, являющееся объединением всех div и span элементов в документе, дополнительно фильтруется, чтобы включать только те, которые имеют class="foo", а последний дает вам объединение 1) набора всех div элементов, имеющих class="foo", и 2) набор всех элементов span, имеющих class="foo".

Должно быть достаточно очевидно, что эти два набора содержат одно и то же.

+0

любить изучать новые вещи ... так +1 –

1

Эта конструкция работает:

(//golfer | //batter)[@ID="2" or @ID="3"] 

... к моему большому удивлению.

+0

'(// div | // span) [@ class =" foo "]' тоже. Благодаря! – Blender

+0

Почему это удивительно? Это довольно просто, но не очень идиоматично. –

+0

Обратите внимание, что '(// golfer | // batter) [@ ID =" 2 "или @ ID =" 3 "]' не эквивалентен '// golfer [@ ID =" 2 "] | // Тесто [@ ID = "3"] '. Я упоминаю это только потому, что вы решили показать пример, который действительно не соответствовал первоначальному вопросу OP, так что это может запутать в контексте эквивалентные выражения, показанные в моем ответе. –

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