2016-02-23 3 views
-1

Мне нужно извлечь текст из двух из многих узлов. Имея следующий XML:XPath для извлечения текста из двух из многих узлов

<nodes> 
    <first>1</first> 
    <second>2</second> 
    <third>3</third> 
</nodes> 

Я хочу, чтобы извлечь только текст из first и second узлов, чтобы иметь результат 12. Как я могу это сделать?

Запрос concat(/nodes/first/text(), /nodes/second/text()) работает для меня, но я ищу что-то более общее и без дублирования /nodes.

+0

Почему этот вопрос был занижен? Пожалуйста, предоставьте причину, я могу это исправить. –

ответ

1

Это будет зависеть от вашей реализации. Используя xpath 1, выбранный вами путь будет единственным, что будет работать (кроме использования реализации, для которой вы можете писать функции расширения). XPath 1 не может справиться с этим самостоятельно.

Однако мы можем выбрать все соответствующие узлы с помощью

/nodes/*[local-name()='first' or local-name()='second'] 

или

/nodes/*[self::first or self::second] 

или если вы хотите диапазон позиций, мы можем упростить это

/nodes/*[position()<3] 

, а затем используйте нашу реализацию для выполнения конкатенации.

Например, с помощью XSLT, я мог бы сделать

<xsl:for-each select="/nodes/*[position()&lt;3]"> 
    <xsl:value-of select="."/> 
</xsl:for-each> 

или с использованием функции XPath на языке программирования, мы могли бы перебрать результат и сцепить его. Например, с помощью Python и библиотеки LXML (где корень является объектом lxml.etree держа документ), мы могли бы сделать (с помощью селектора на основе позиции)

"".join(root.xpath("/nodes/*[position()<3]/text()")) 

Использование XPath 2, это возможно непосредственно

string-join(/nodes/*[position()<3],'') 

в самом деле, если нам нужно выбрать по имени, XPath 2 позволяет упростить первое выражение XPATH в списке, и сделать

string-join(/nodes/*[local-name()=('first','second')]) 
+0

Есть ли способ избежать пост-обработки с использованием XPath 2.0? –

+0

@MichalKordas Что вы подразумеваете под «пост-обработкой»? Если вы имеете в виду только использование xpath 2, выражение в конце моего сообщения просто выберет значение «12» по вашему запросу. Нет необходимости в выполнении какой-либо дополнительной работы - движок xpath выполняет всю работу. Это ограничение имеет только xpath 1. К сожалению, инструменты xpath 2 намного реже. – Matthew

+0

Да, я имел в виду использование только XPath, никаких других инструментов. BTW, мои узлы могут быть где угодно, и они не упорядочены, поэтому я не могу использовать 'position()' –

Смежные вопросы