Проблема XPath с пропуском элемента / объединением совпадений

#xpath

#xpath

Вопрос:

Это данные:

 <p>
<span class="z">XXX</span><br/>
123456<br/>
78910</p>
  

Также повсюду есть пробелы и новые строки.
Мне нужно получить только ‘ <br/>123456<br/>78910 ‘, пропуская элемент span.
Когда я запускаю этот xpath: ‘//p/text()’, я получаю 3 совпадения: Первая — куча пробелов и новых строк, вторая — с 123456 и третья — с 78910.
Есть ли какой-либо другой способ пропустить элемент span? Возможно ли как-то объединить совпадения?

Комментарии:

1. Хороший вопрос, 1. Смотрите мой ответ для выражения XPath, которое точно выбирает нужные узлы. 🙂

2. Что вы подразумеваете под «объединением совпадений»?

Ответ №1:

Похоже, вы пытаетесь выбрать каждый узел после span элемента:

 /p/span/following-sibling::node()
  

Если вы хотите, чтобы дочерние элементы текстового узла без пробелов содержали только текстовые узлы:

 /p/text()[normalize-space()]
  

Комментарии:

1. /p/span/following-sibling::node()[normalize-space()] и /p/text()[normalize-space()] вернули 2 совпадения, совпадений только с пробелами сейчас нет, но мне нужно объединить эти два совпадения

Ответ №2:

Использовать:

 /p/node()[not(self::span) and (not(self::text[not(normalize-space())]))]
  

При этом выбираются все узлы, которые являются дочерними элементами верхнего элемента p и которые, если они являются текстовыми узлами, не являются только пробелами.

Комментарии:

1. Это дает мне 5 совпадений — 3 только с пробелами и два с текстом, но мне нужно объединить их в 1 совпадение. Возможно ли это?

2. @Desecho: Выражение XPath выбирает узлы — оно не может создать один узел из нескольких, потому что XPath является языком запросов и не изменяет XML-документ.