首页 文章

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

提问于
浏览
1

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

在下面的示例中,我想选择"input"元素,其中,在同一 tr 行中,存在具有特定文本的 td 元素 .

my example path - 不返回任何匹配项

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

source code

<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 回答

  • 3

    给定节点集时, contains 函数将仅在该节点集中的第一个节点上运行 . 在你的情况下,它是 <td><a href="xxx" target="_blank">xxxx, yyyyy</a></td> . 您可以改为重构表达式,以便谓词在所有要检查的节点上运行, contains 函数对单个项目进行操作:

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

    这将获得任何 input 元素,其中父's parent' s父元素包含 td 元素,其文本节点包含文本 15-935-331 .


    指定这个的更简单的方法是使用 ancestor::tr[1]/td 代替 ../../../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 ,并且 trinput 元素放在 form 元素下面的任何位置 .

相关问题