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

相關問題