Подтвердить что ты не робот

XPath возвращает только элементы, содержащие текст, а не его родители

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

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

ok, до сих пор я:

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

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

любые идеи?

4b9b3361

Ответ 1

Вы хотите найти элементы, содержащие "match", или равные "match"?

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

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

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

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

Здесь будут найдены все элементы, содержащие "совпадение" в текстовом значении node (соответствует random2 и random3):

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

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

//*[matches(text(),'(^|\W)match($|\W)','i')]

Ответ 2

Try

//re:*[. ='match']