XPath 仅获取嵌套 HTML 的第一个父级

Joh*_*ohn 2 xpath

我是 XPath 的新手。有人可以解释一下如何解决这个问题:

<table>
   <tr>
       <td>
           <table>
                <tr>
                    <td>
                         <table>
                             <tr>
                                 <td>Label</td>
                                 <td>value</td>
                             </tr>
                         </table>
                    </td>
                </tr>
           </table>
       </td>
   </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

我尝试获取<tr>其中包含的Label价值,但它对我不起作用,

这是我的代码:

//td[contains(.,'Label')]/ancestor::tr[1]
Run Code Online (Sandbox Code Playgroud)

期望的结果:

<tr>
   <td>Label</td>
   <td>value</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗 ?

har*_*rpo 5

此表达式与tr您想要的匹配:

//tr[contains(td/text(), 'Label')]
Run Code Online (Sandbox Code Playgroud)

与您的版本一样,这首先扫描tr文档中的所有元素,但此版本仅使用单个谓词。它将td/text()测试限制为该行的孙子节点的实际文本节点。如果您刚刚使用td,则 的所有td后代文本节点将被收集并连接,并且外部tr将匹配。

更新:此外,就其价值而言,您的表达式不起作用的原因是ancestor轴按文档顺序返回元素,而不是从上下文节点的点“向外”。这是我自己遇到的事情,因为它有点不直观。为了使你的方法发挥作用,你需要说

//td[contains(.,'Label')]/ancestor::tr[last()]
Run Code Online (Sandbox Code Playgroud)

代替

//td[contains(.,'Label')]/ancestor::tr[1]
Run Code Online (Sandbox Code Playgroud)