2010-06-08 37 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

您是否在寻找匹配,如果它包含单词在文本中的任何地方(例如,“看,这将*匹配*单词”)具有相等的值,或仅元素“比赛“(忽略周围的空白)? – 2010-06-08 11:23:14

+0

这不是相关的,要么工作。问题主要是它还是回到父母身边 – julian 2010-06-13 18:05:54

回答

99

你想找到元素包含 “匹配”,或等于 “匹配”?

这会发现,有文本节点是相等的“匹配”(匹配没有因为领先而在random2尾随空白的元素)的元素:

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

这将找到的所有元素在删除前导和尾随空白(匹配random2)后,文本节点等于“匹配”:

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

这会发现,包含在文本节点值 '匹配' 的所有元素(匹配random2random3):

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

XPATH 2.0溶液使用匹配()函数和一个正则表达式模式,查找包含'匹配'的文本节点,并从字符串的开始处开始(即^)或字边界(即\W),并在字符串的末尾(即$)或字边界终止。第三个参数i评估正则表达式模式不区分大小写。 (匹配random2

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

你的第二个陈述是不正确的。提示:带有多于一个文本节点的元素,其中第一个文本节点不包含“匹配”。 – 2010-06-08 02:37:12

+0

谢谢@Dimitre。更新它应该更强大。 – 2010-06-08 11:16:20

+0

其实我想运行一个特定的查询,像'^ ma(t | T)。“' 我可以使用第一个吗? //*[text()='^ma(t|T).*']对不对? – julian 2010-06-09 18:58:46

相关问题