のこぎりを使用しています。
深くネストされたパスがあるとします。
//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
要素 (この場合は 1 つだけ)) が出力にコピーされます。
<h5 id="id1"/>
中間レベルの数を数えたくないが、特定の数 (たとえば 7) を超えていないことが確実な場合は、次のように記述できます。
//h1[descendent::*[not(position() > 7)][self::h1]]
これにより、と子孫の間のレベルの「距離」が 7 を超えない、 anyh5
の子孫が選択h1
h1
h5
されます。
注意してください:
以下のような表現 - 他の回答で示唆されているように:
//h1//h5
上記のドキュメントに対して誤って選択します:
<h5 id="id1"/>
<h5 id="id2"/>
選択した 2 つの要素の 2 番目は、その先祖h5
から必要な要素よりも離れていh1
ます。