我正在使用 Nokogiri。
假设我有一个深度嵌套的路径:
//h1/h2/h3/h4/h5
我想我可以使用以下路径:
//h1/*/*/*/h5
有什么办法可以避免使用多个星号?像//h1/.../h5
什么?
我不想继续计算嵌套的级别。
对于从 h1 下降的所有 h5 元素,请使用:
//h1//h5
或者您可能喜欢更简单的 css 样式:
h1 h5
只需使用://
,即://h5
。此 XPath 将选择所有h5
元素。见规范:http ://www.w3.org/TR/xpath/#path-abbrev
如果要选择所有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
。