2011-12-14 39 views
2

我有以下的HTML的XPath位置過濾工作不正常

<html> 
[snip] 
<table> 
[snip] 
<tr><td>One</td><td>1-1</td></tr> 
[snip] 
</table> 
[snip] 
<table> 
[snip] 
<tr><td>One</td><td>1-1-1</td></tr> 
[snip] 
</table> 
</html> 

..和我想得值「1-1-1」使用以下XPath

//tr[td[1] = 'One'][2]/td[2] 

我將其描述爲從包含至少一個td元素的第二個tr元素中檢索第二個td元素值,其中第一個td元素值爲'One'。我已經嘗試過各種改動,如position()=last(),但無濟於事。

我只知道在父行的第一個單元格中第二次出現的文本「One」標識了我可以從第二個單元格中取出文本的行......所以硬編碼的東西不起作用例如//table[2]/tr[1]/td[2])。

有人能告訴我爲什麼上面的xpath不起作用嗎?我已經看過了W3C的網站,發現類似的XPath:

child::*[self::chapter or self::appendix][position()=last()] 

描述如下:

選擇上下文節點

..這是最後一章或附錄孩子與我正在嘗試做的類似,但也許嵌套是不允許的。

回答

2

簡短回答

用途:

(//tr[td[1]='One'])[2]/td[2] 

說明

我會將此描述爲從包含至少一個TD元素二號 tr元素檢索第二td元素值,其中第一td 元素值爲'One'。

什麼//tr[td[1]='One'][2]實際選用的是具有第一td孩子,其值是One是他們的父母的第二個這樣的tr所有tr元素。

爲什麼?該表達式:

//tr[td[1]='One'][2] 

...相當於:

/descendant-or-self::node()/child::tr[td[1]='One'][2] 

寫這樣一來,它更容易看到[2]應用早於你原來想象。添加括號:

(/descendant-or-self::node()/child::tr[td[1]='One'])[2] 

...使我們首先選擇具有第一td孩子,其值是One然後採取第二點從集合中的所有元素tr

+0

哎喲,我應該意識到這種區別。謝謝你的解釋! – user1098705 2011-12-15 04:31:43