XPath / XPath-Achsen / Verschachtelungstiefe
![]() |
![]() |
➪ Um eine maximale Verschachtelungstiefe ermitteln zu können, ist eine kombinierte Anwendung von descendant-or-self und ancestor-or-self sinnvoll.
Auf dieser Seite:Aus dem XML-Input-Dokument
<info ebene="1">
<info ebene="2">
<info ebene="3"/>
</info>
<info ebene="2">
<info ebene="3">
<info ebene="4">
<info ebene="5"/>
</info>
</info>
</info>
</info>
soll die maximale Tiefe der Verschachtelung der info Elemente ermittelt werden, die im obigen Fall zum besseren Verständnis im Attribut "ebene" angegeben ist. Erwartet wird hier also eine maximale Verschachtelungstiefe von 5.
Eine mögliche Lösung liegt in der angekündigten kombinierten Verwendung von descendant-or-self und ancestor-or-self, zusätzlich ergänzt um die Funktionen max und count.
Die innere Schleife for $vch in ... gibt mehrere Einzelinformationen über die Tiefe der jeweiligen Verschachtelung zurück (count($vch/ancestor-or-self::info)); von diesen Einzelwerten übernimmt die max-Funktion den Maximalwert.
<xsl:template match="/">
<Info>
<xsl:value-of
select="max(
for $vch in ./descendant-or-self::info
return
count($vch/ancestor-or-self::info)
)"/>
</Info>
</xsl:template>
Das Ergebnis ist nachvollziehbar:
<Info>5</Info>
In XQuery liest sich der Aufruf der XPath-Achsen descendant-or-self und ancestor-or-self für ein anderes XML-Input-Dokument ähnlich:
<erg>
{
max(
for $vch in ./descendant-or-self::*
return
count($vch/ancestor-or-self::*)
)
}
</erg>
./descendant-or-self::info
=> for-each(
function($w){
$w/ancestor-or-self::info => count()
}
)
=> max()
wg / 14. März 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de