XPath: выбрать текстовый узел

115

Имея следующий XML:

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

Как выбрать первый или второй текст node через XPath?

Что-то вроде этого:

/node/text()[2]

конечно, не работает, потому что это объединенный результат каждого текста внутри node.

  • 11
    Вы писали: /node/text()[2] [...] не работает, потому что это объединенный результат каждого текста внутри узла. Это неправильно: это означает, что второй текстовый узел является потомком корневого элемента node . Строковым значением (конкатенация текстовых узлов-потомков) будет string(/node)
  • 0
    Вы имеете в виду, что запрос Xpath должен работать? Ну, я думаю, у меня есть еще одна проблема тогда. ;) Спасибо!
Показать ещё 1 комментарий
Теги:
xpath
selection

2 ответа

133
Лучший ответ

Имея следующий XML:

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

Как выбрать первый или второй текст node через XPath?

Использование

/node/text()

Это выбирает всех текстовых node дочерних элементов верхнего элемента (с именем "node" ) документа XML.

/node/text()[1]

Это выбирает первый текстовый node дочерний элемент верхнего элемента (с именем "node" ) документа XML.

/node/text()[2]

Это выбирает второй текстовый node дочерний элемент верхнего элемента (с именем "node" ) документа XML.

/node/text()[someInteger]

Это выбирает дочерний элемент someInteger-th text- node верхнего элемента (с именем "node" ) документа XML. Это эквивалентно следующему выражению XPath:

/node/text()[position() = someInteger]
  • 1
    /node[2]/text() прекрасно работает для меня в Chrome 39.
  • 0
    Спасибо за комментарий. Спасло несколько часов грубой силы!
Показать ещё 5 комментариев
23

ваш 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню