2014-10-09 3 views
3

Я хочу найти всех сразу смежных братьев и сестер узла, используя одно выражение XPath, если это вообще возможно. Учитывая входКак найти всех сразу смежных братьев и сестер с XPath

<a id="1"/> 
<start/> 
<a id="2"/> 
<a id="3"/> 
<b/> 
<a id="4"/> 

и выражение XPath похож на //start/following-sibling::a, я хочу, чтобы выбрать а [2] и а [3], но не а [4]. Кроме того, если между есть промежуточные элементы, начинаются и a [2], ничего не следует выбирать.

ответ

4

Самый простой я могу найти это было:

//start/following-sibling::a intersect //start/following-sibling::*[name()!='a'][1]/preceding-sibling::a 

Что это делает:

  1. Возьмите все a братьев следующие start: //start/following-sibling::a. (Результат: a2, a3, a4.) Установите это на одну сторону на данный момент.
  2. Затем возьмите первый не родной брат следующего start: //start/following-sibling::*[name()!='a'][1] (Результат:. Б)
  3. И найти все a узлов, которые предшествуют его: /preceding-sibling::a. (Результат: a1, a2, a3)
  4. Возьмем пересечение 1 и 3. (Результат: a2, a3)

Update: Другой способ выражения это //start/following-sibling::*[name()!='a'][1]/preceding-sibling::a[preceding-sibling::start], это примерно переводится: возьмите первый не-брат, следующий за start, отсчет назад, но выберите только те элементы, которым предшествует start.

Update 2: Если вы знаете, что b всегда будет называться b, вы можете, конечно, заменить довольно трудно читать following-sibling::*[name()!='a'][1] часть с following-sibling::b[1].

+0

Спасибо! Метод в вашем ** Обновление ** работает отлично. Должен работать на моих навыках XPath ... – svenax

0

нет способа проверить это, но //start/following-sibling::*[1][self::a] должен возвращать немедленный следующий родственный, но только если это «а»

+0

Это хорошо, но, как вы говорите, он возвращает только первый 'a'. Требование состоит в том, чтобы вернуть все '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', ' – biziclop

+0

да - думаю, ваше пересечение будет лучше :) – Ochi

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