XPath深层嵌套元素?

时间:2012-11-01 03:36:42

标签: ruby xml xpath nokogiri

我正在使用Nokogiri。

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

//h1/h2/h3/h4/h5

我想我可以使用以下路径:

//h1/*/*/*/h5

有什么办法可以避免使用多个星号吗?像//h1/.../h5

这样的东西

我不想继续计算嵌套水平。

3 个答案:

答案 0 :(得分:11)

对于从h1使用下降的所有h5元素:

//h1//h5

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

h1 h5

答案 1 :(得分:5)

只需使用://,即://h5。此XPath将选择所有h5元素。请参阅规范:http://www.w3.org/TR/xpath/#path-abbrev

答案 2 :(得分:2)

如果您想要选择与其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]]

这会选择h5的任何h1后代,其中h1和后代h5之间的“距离”不超过7

请注意

如下所示的表达式 - 如其他答案所示:

//h1//h5

错误地选择了上述文件

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

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