2011-04-12 85 views
1

我有一個類似的樹的一個:使用節點選擇祖父母選擇它的後代

  tr 
     _|_ 
     td td 
     _| |_ 
    div  div 
    _|  |_ 
input  "foobar" 

我有節點「foobar的」選中的使用:

//*[normalize-space(text())='foobar'] 

但我我無法選擇曾祖父母tr並選擇了很大的孩子input有任何建議嗎?

+0

好問題,+1。查看我的答案,瞭解可以使用的詳盡XPath表達式集。 :) – 2011-04-13 04:35:19

+0

準確地說,我正在尋找。 +1。 – anujin 2013-10-11 08:09:00

回答

2

我有節點「foobar的」選中 使用:

//*[normalize-space(text())='foobar'] 

但我無法選擇偉大的 祖父母tr和選擇偉大的 孩子「foobar」與它。

我想你想要選擇其字符串值(標準化後)爲「foobar」的元素,從頂部元素tr開始。

這裏是一個XPath表達式從頂部elemet tr「開始」,並選擇想要的元素:

/tr//*[normalize-space()='foobar'] 

如果您需要選擇文本節點本身(而不是其元素的父):

/tr//text()[normalize-space()='foobar'] 

如果你想避免//縮寫的昂貴和緩慢的評價(因爲你知道文檔結構),用這句話:

/tr/td/div[normalize-space()='foobar'] 

甚至:

/tr/td[2]/div 

更新

現在OP改變了他的問題,並希望從已標準化的字符串值 'foobar' 命令的div選擇input元素。

這裏是一個XPath表達式恰好選擇這個

../..//input 

../../td[1]/div/input 

請注意:如果這些表達式沒有選擇任何節點,它是最有可能該文檔有一個默認的命名空間 - 搜索XPath默認命名空間 - 這個問題有很多很好的答案 - 在SO和互聯網上。

+0

我其實在開頭寫錯了。我有foobar文本節點,我想訪問生活在同一個tr父母的輸入。我編輯了我的問題上面。 – tipu 2011-04-13 15:52:43

+0

很好地解釋了迪米特雷。它有幫助。 +1。 – anujin 2013-10-11 08:08:02

+0

@anujin,不客氣。 – 2013-10-11 14:06:58

0

這個XPath表達式每選擇一個元件具有空白正常化後後代文本節點等於 「foobar的」:

//*[.//text()[normalize-space()='foobar']]