XPath如何用于深度嵌套的元素?

9

我正在使用Nokogiri。

假设我有一个嵌套深的路径:

//h1/h2/h3/h4/h5

我认为我可以使用以下路径:
//h1/*/*/*/h5

有没有办法避免使用多个星号?例如类似于//h1/.../h5这样的方法?

我不想一直数嵌套的层数。


您需要所有的 h5 标签还是只需要特定的一个?如果您需要特定的一个,那么您是否有 h5 的 ID 或 CLASS 可以帮助您导航到它,或者有关于特定标签的某些具体信息可以用作标志? - the Tin Man
虽然pguardiario的回答是正确的,考虑到你提出的问题,正如Tin Man所暗示的,很可能有更好的方法来特定地针对你正在寻找的元素。 - Mark Thomas
@theTinMan Mark Thomas - 我忘记了这个问题 - 对此感到抱歉。问题在于我有一个如下所示的h5,以及另一个层次结构中的另一个h5。目前,pguardiario的答案对我来说非常好。稍后我会进行更新。谢谢你的帮助。 - nilanjan
3个回答

12

元素的所有子级

元素,请使用以下内容:
//h1//h5

或者您可能喜欢更简单的CSS样式:

h1 h5

6

4

如果你想选择所有距离它们的h1祖先正好4级的h5,那么可以使用以下代码:

//h5[ancestor::*[4][self::h1]]

XSLT基于的验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="//h5[ancestor::*[4][self::h1]]"/>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于以下 XML 文档时:

<t>
 <head/>
 <body>
  <h1>First Main title
    <a>
     <b>
       <c>
         <h5 id="id1"/>
         <d>
           <h5 id="id2"/>
         </d>
       </c>
     </b>
    </a>
  </h1>
 </body>
</t>

在这里,XPath表达式被评估,评估结果(选择的h1元素,在本例中仅为一个)被复制到输出中。

<h5 id="id1"/>

如果您不想计算中间级别的数量,但确定它们不超过某个数量(比如7),可以这样写:

//h1[descendent::*[not(position() > 7)][self::h1]]

这选择任何一个h1的任何h5后代,其中h1和后代h5之间的“距离”在级别上不超过7个。

请注意:

像下面这样的表达式——如其他答案所建议:

//h1//h5

错误地选择了上述文档

<h5 id="id1"/>
<h5 id="id2"/>

两个选定的h5元素中第二个距其h1祖先更远。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接