(aktualisiert!)

IT-Trainings in Zeiten des Corona-Virus, Veranstaltungstipps der www.gfu.net:
Schulung XML Einfuehrung und Grundlagen *** Schulung Python fuer Programmiereinsteiger *** Schulung XML, XSLT, XPath, XSL-FO Einfuehrung *** Schulung Java/JSP/HTML/JDBC/XML Komplett *** Schulung XML mit Altova XMLSpy *** Schulung XML Grundlagen, XSL-FO, SVG, DocBook, DITA *** Schulung XML - der professionelle Ueberblick *** Schulung XML-Schema Intensiv *** Schulung Einstieg in die Programmierung *** Schulung C++ fuer Programmiereinsteiger *** Schulung VB.NET fuer Visual Basic-Programmierer ***


XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Achsen / Verschachtelungstiefe

Verschachtelungstiefe

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 und , zusätzlich ergänzt um die Funktionen und .

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>

Ermittlung der Verschachtelungstiefe in XQuery

In XQuery liest sich der Aufruf der XPath-Achsen und für ein anderes XML-Input-Dokument ähnlich:


<erg>
{
  max(
    for $vch in ./descendant-or-self::* 
    return 
    count($vch/ancestor-or-self::*)
    )
}
</erg>

Lösung in XPath 3.0


./descendant-or-self::info 
  => for-each(
    function($w){
      $w/ancestor-or-self::info => count() 
    }
  )  
  => max()

wg / 7. Mai 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Achsen10.html