【问题标题】:xpath expression - select element where parent contains a specific textxpath 表达式 - 选择父元素包含特定文本的元素
【发布时间】:2023-03-18 17:07:02
【问题描述】:

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

在下面的示例中,我想选择“输入”元素,其中在同一 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>

【问题讨论】:

    标签: html firefox xpath


    【解决方案1】:

    contains 函数,当给定一个节点集时,只会在该节点集中的第一个节点上运行。在您的情况下,它是&lt;td&gt;&lt;a href="xxx" target="_blank"&gt;xxxx, yyyyy&lt;/a&gt;&lt;/td&gt;。 您可以改为重构表达式,以便谓词对所有要检查的节点进行操作,而 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,并对其进行操作。

    【讨论】:

      【解决方案2】:

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

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

      这使它更加独立于 HTML 的实际结构。它选择包含给定文本的tdtr,并从该tr 中获取input 元素下方的form 元素。

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 1970-01-01
        • 2018-06-15
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        相关资源
        最近更新 更多