#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-документ.