Маючи таку XML:
<node>Text1<subnode/>text2</node>
Як вибрати перший чи другий текстовий вузол через XPath?
Щось на зразок цього:
/node/text()[2]
звичайно не працює, оскільки це об'єднаний результат кожного тексту всередині вузла.
Маючи таку XML:
<node>Text1<subnode/>text2</node>
Як вибрати перший чи другий текстовий вузол через XPath?
Щось на зразок цього:
/node/text()[2]
звичайно не працює, оскільки це об'єднаний результат кожного тексту всередині вузла.
Відповіді:
Маючи таку 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]
/node[2]
не повинен вибрати жоден вузол, якщо вихідний XML-документ добре сформований. За визначенням у добре сформованому документі XML є лише один (єдиний) верхній елемент - також відомий якdocument-element
//*[text()]
все одно. /html/text()
не працює.
/html/text()
не вибираються всі текстові вузли в документі - лише текстові вузли, які є дітьми (а не нащадками) верхнього, html
елемента. Ви, мабуть, хочете /html//text()
. Певне знання та розуміння XPath зазвичай потрібно для побудови виразів XPath.
ваш 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
/node/text()[2]
[...] не працює, тому що це об'єднаний результат кожного тексту всередині вузла. Це неправильно: це означає другого дочірнього текстового вузлаnode
кореневого елемента . Значення рядка (конкатенація текстових вузлів нащадків) будеstring(/node)