9

我正在使用 Nokogiri。

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

//h1/h2/h3/h4/h5

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

//h1/*/*/*/h5

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

我不想继续计算嵌套的级别。

4

3 回答 3

12

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

//h1//h5

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

h1 h5
于 2012-11-01T03:45:04.467 回答
6

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

于 2012-11-01T03:41:28.473 回答
4

如果要选择所有h5低于其 h1 祖先 4 级的所有内容,请使用:

//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]]

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

请注意

像下面这样的表达式 - 正如其他答案中所建议的那样:

//h1//h5

错误地选择了上述文件

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

两个选定元素中的第二个元素与其祖先h5的距离大于想要的元素h1

于 2012-11-01T04:18:33.280 回答