我正在使用Nokogiri。
假设我有一个深度嵌套的路径:
//h1/h2/h3/h4/h5
我想我可以使用以下路径:
//h1/*/*/*/h5
有什么办法可以避免使用多个星号吗?像//h1/.../h5
?
我不想继续计算嵌套水平。
答案 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
祖先所需的距离更远。