Имея следующий 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]
Это выбирает 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 и мой в реализации 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)