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

meg*_*off 2 html firefox xpath

我目前很难找到正确的 xpath 表达式来选择一个输入元素,其中其父/兄弟元素包含特定文本。

在下面的示例中,我想选择“输入”元素,其中在同一tr行中td存在具有特定文本的元素。

我的示例路径- 不返回匹配项

//input[contains(../../../td/text(),"15-935-331")]
Run Code Online (Sandbox Code Playgroud)

源代码

<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>
Run Code Online (Sandbox Code Playgroud)

Kei*_*all 5

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

//input[../../../td/text()[contains(., "15-935-331")]]
Run Code Online (Sandbox Code Playgroud)

这将获得任何input元素,其中父级的父级的父级包含一个td元素,该元素的文本节点包含 text 15-935-331


指定这方面的一个也许更简单的方法是使用ancestor::tr[1]/td代替../../../td

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

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