XPath возвращает только элементы, содержащие текст, а не его родителей - PullRequest
64 голосов
/ 08 июня 2010

В этом xml, я хочу соответствовать, элемент, содержащий 'match' (элемент random2)

<root>
 <random1>
  <random2>match</random2>
  <random3>nomatch</random3>
 </random1>
</root>

хорошо, пока у меня есть:

//[re:test(.,'match','i')] (with re in the proper namespace)

это возвращает random2, random1 и root ... Я хотел бы получить только "random2"

какие-нибудь идеи?

Ответы [ 2 ]

136 голосов
/ 08 июня 2010

Хотите найти элементы, которые содержат"совпадение" или равно"совпадение"?

При этом будут найдены элементы с текстовыми узлами, которые равны 'match' (не соответствует ни одному из элементов из-за начальных и конечных пробелов в random2):

//*[text()='match']

Здесь будут найдены все элементы с текстовыми узлами, которые равны «совпадению», после удаления начальных и конечных пробелов (совпадения random2):

//*/text()[normalize-space(.)='match']/parent::*

При этом будут найдены все элементы, которые содержат 'match' в значении текстового узла (соответствует random2 и random3):

//*[contains(text(),'match')]

Это XPATH 2.0 решение использует функцию match () и шаблон регулярного выражения, который ищет текстовые узлы, которые содержат «match» и начинаются в начале строки (то есть ^) или слова граница (т. е. \W) и заканчивается концом строки (т. е. $) или границей слова. Третий параметр i оценивает регистр без учета регистра. (соответствует random2)

//*[matches(text(),'(^|\W)match($|\W)','i')]
0 голосов
/ 08 июня 2010

Попробуйте

//re:*[. ='match']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...