2014-03-07 62 views
2

我是XPath中的新手。有人能解釋如何解決此問題:XPath只獲得嵌套HTML的第一個父代

<table> 
    <tr> 
     <td> 
      <table> 
       <tr> 
        <td> 
         <table> 
          <tr> 
           <td>Label</td> 
           <td>value</td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
      </table> 
     </td> 
    </tr> 
</table> 

我試圖讓<tr>包含Label價值,但它不爲我工作,

這裏是我的代碼:

//td[contains(.,'Label')]/ancestor::tr[1] 

預期結果:

<tr> 
    <td>Label</td> 
    <td>value</td> 
</tr> 

有人可以幫我嗎?

回答

4

這則表達式匹配的tr要:

//tr[contains(td/text(), 'Label')] 

喜歡你的,這將啓動通過掃描文檔中的所有元素tr,但這個版本使用只是一個單一的謂語。 td/text()將測試限制爲該行的孫子的實際文本節點。如果您剛剛使用td,則所有td的後代文本節點將被收集並連接,並且外部tr將匹配。

UPDATE:另外,對於它的價值,你的表達是不工作的原因是ancestor軸返回元素在文檔順序,而不是「向外」從上下文節點的點。這是我自己碰到的事情,因爲它有點不直觀。爲了使你的方法工作,你就需要說

//td[contains(.,'Label')]/ancestor::tr[last()] 

,而不是

//td[contains(.,'Label')]/ancestor::tr[1] 
0

我有同樣的問題,除了文本「標籤」,有時在嵌套跨度,甚至更遠嵌套在td中。例如:

<td><span>Label</span></td> 

以前的答案只能找到「標籤」,如果它是在爲TD的直接子的文本元素。這個問題有點困難,因爲我們需要搜索包含任何子項中的文本「標籤」的td。由於tds是嵌套的,因此所有tds都具有包含文本'標籤'的後代。所以,我發現克服這個問題的唯一方法是添加一個檢查,確保我們選擇的td不包含帶搜索文本的td。

//td[contains(., 'Label') and not(.//td[contains(., 'Label')])]/ancestor::tr[1] 

這是說給我所有的都含「標籤」一個死者文字的TDS,但不包括包含有含「標籤」(嵌套祖先)一死者文字TD所有TD。這會返回包含文本的最多的td。然後你可以回到使用祖先包含這個td的tr。

此外,如果你只是想包含文本使用最低的表這樣的:

//table[contains(., 'Label') and not(.//table[contains(., 'Label')])] 

,或者你可以選擇直接在TR:

//tr[contains(., 'Label') and not(.//tr[contains(., 'Label')])] 

這似乎是一個常見的問題,但我沒有在任何地方看到解決方案。所以,我決定張貼這個舊的未答覆的問題,希望它有助於某人。

相關問題