2010-06-08 2 views
50

В этом XML, я хочу, чтобы соответствовать, элемент содержит «спичку» (Random2 элемент)XPath возвращать только элементы, содержащие текст, а не его родители

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

нормально, до сих пор у меня есть:

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

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

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

+0

Вы хотите, чтобы соответствовать, если он содержит слово в любом месте текста (например, «увидеть, если это будет * матч * слово»), или только те элементы, которые имеют значение, равное «матч "(игнорируя окружающие пробелы)? –

+0

это не так уж важно, либо это сработает. Проблема была в основном в том, что она возвращала также своих родителей – julian

ответ

99

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

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

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

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

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

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

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

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

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

Ваше второе утверждение неверно. Подсказка: возьмите элемент с несколькими текстовыми узлами, чей первый текстовый узел не содержит «match». –

+0

Спасибо @Dimitre. Обновлено с чем-то, что должно быть более надежным. –

+0

На самом деле я хочу запустить конкретный запрос с регулярным выражением типа '^ ma (t | T). *' Я могу использовать первый? //*[text()='^ma(t|T).* '] правильно? – julian

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