XPath: виберіть текстовий вузол


150

Маючи таку XML:

<node>Text1<subnode/>text2</node>

Як вибрати перший чи другий текстовий вузол через XPath?

Щось на зразок цього:

/node/text()[2]

звичайно не працює, оскільки це об'єднаний результат кожного тексту всередині вузла.


11
Ви писали: /node/text()[2][...] не працює, тому що це об'єднаний результат кожного тексту всередині вузла. Це неправильно: це означає другого дочірнього текстового вузла nodeкореневого елемента . Значення рядка (конкатенація текстових вузлів нащадків) будеstring(/node)

Ви маєте на увазі, що запит Xpath повинен працювати? Ну, мабуть, у мене тоді ще інша проблема. ;) Дякую!
ядро

Добре запитання, +1. Дивіться мою відповідь для пояснення та кілька виразів XPath, які вибирають або всі, або конкретну дочірню частину текстового вузла верхнього елемента.
Димитрій Новатчев

Відповіді:


183

Маючи таку XML:

<node>Text1<subnode/>text2</node> 

Як вибрати перший чи другий текстовий вузол через XPath?

Використання :

/node/text()

Це вибирає всі дочірні текстові вузли верхнього елемента (з назвою "вузол") документа XML.

/node/text()[1]

Це вибирає першу дочірню частину текстового вузла верхнього елемента (з назвою "вузол") документа XML.

/node/text()[2]

Це вибирає друге дочірнє текстовий вузол верхнього елемента (званий "вузол") документа XML.

/node/text()[someInteger]

Це вибирає деякий дочірній текстовий вузол дочірнього елемента верхнього елемента (званий "вузол") документа XML. Він еквівалентний наступному виразу XPath:

/node/text()[position() = someInteger]

@NaftuliTzviKay: Це означає, що Chrome зламаний. /node[2]не повинен вибрати жоден вузол, якщо вихідний XML-документ добре сформований. За визначенням у добре сформованому документі XML є лише один (єдиний) верхній елемент - також відомий якdocument-element
Димитрій Новатчев,

1
Чи працює це в PHP? Я намагаюся пробирати лише текстові вузли, навіть ті, що знаходяться між набором тегів. Проблема полягає в тому, що розбиває вміст декількох текстових вузлів разом, незалежно від тегів. Використовуючи //*[text()]все одно. /html/text()не працює.
Аарон Гліон

2
@AaronGillion, Так, AFAIK PHP має правильно працюючу оцінку XPath 1.0. Зверніть увагу, що /html/text()не вибираються всі текстові вузли в документі - лише текстові вузли, які є дітьми (а не нащадками) верхнього, htmlелемента. Ви, мабуть, хочете /html//text() . Певне знання та розуміння XPath зазвичай потрібно для побудови виразів XPath.
Димитрій Новатчев

Дякую. Я трохи раніше зрозумів трюк з подвійною косою рисою!
Аарон Гліон

@AaronGillion, ласкаво просимо. Ви можете вивчити основи XPath 1.0 та 2.0 у модулі 2 цього онлайн-курсу: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

ваш xpath повинен працювати. Я перевірив ваш xpath і mine в обох проектах MarkLogic і Zorba Xquery / Xpath.

Обоє повинні працювати.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.