xpath表达式 - 选择父元素包含特定文本的元素

时间:2016-11-25 08:40:34

标签: html firefox xpath

我目前正在努力寻找正确的xpath表达式,以选择其父/兄弟元素包含特定文本的输入元素。

在下面的示例中,我想选择"输入" element在同一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 个答案:

答案 0 :(得分:3)

作为Keith发布的解决方案的替代方案,您可以使用以下XPath表达式:

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

这使得它更加独立于HTML的实际结构。它选择包含tr包含给定文字的td,并从tr中选择input元素位于form元素下方的任何位置。

答案 1 :(得分: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

指定此方法的一种更简单的方法是使用ancestor::tr[1]/td代替../../../td

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

这将获得祖先层次结构中的第一个tr,并对其进行操作。