2016-11-25 66 views
1

我很努力地找到正確的xpath表達式來選擇其父/同級元素包含特定文本的輸入元素。xpath表達式 - select父元素包含特定文本的元素

在下面的示例中,我想選擇「input」元素,其中在同一行tr中,存在具有特定文本的td元素。

我的例子路徑 - 收益不匹配

//input[contains(../../../td/text(),"15-935-331")] 

源代碼

<tr> 
    <td><a href="xxx" target="_blank">xxxx, yyyyy</a></td> 
    <td>Mr</td> 
    <td></td> 
    <td> 15-935-331</td> 
    <form id="betreuerModel" action="xxxx" method="POST"> 
     <td class="tRight"> 
     <input value="Bearbeiten" id="bearbeiten" name="bearbeiten" class="submit" title="Bearbeiten" type="submit"/> 
     </td> 
    </form> 
</tr> 
<tr> 
// .. next row with same structure 
</tr> 

回答

2

contains功能,給定一個節點集時,將只在超第一個節點上運行節點集。在你的情況下,它是<td><a href="xxx" target="_blank">xxxx, yyyyy</a></td>。 你可以代替重構你的表達,這樣的斷言所有檢查節點上運行,而contains功能上單個項目的工作:

//input[../../../td/text()[contains(., "15-935-331")]] 

這將讓任何input元素,在父母的父母的父母含有td元素帶有包含文本15-935-331的文本節點。


一個也許更簡單的方式來指定,這將是代替../../../td使用ancestor::tr[1]/td

//input[ancestor::tr[1]/td/text()[contains(.,"15-935-331")]] 

這將得到祖先層次結構中的第一個tr,並對其進行操作。

2

作爲替代張貼由Keith的解決方案,則可以使用下面的XPath表達式:

//tr[td[contains(., "15-935-331")]]/form//input 

這使得多一點獨立於HTML的實際結構。它選擇tr其中包含td包含給定的文本,並從該tr它將input元素form元素以下的任何位置。

+0

非常感謝您解決這兩個解決方案 – megloff

相關問題