4.1.10 XPath-Achsenbereich selektieren
Mit den folgenden Ausdrücken selektiert man ausgehend vom aktuellen Kontextknoten alle Knoten, die auf den betreffenden XPath
Achsen liegen:
-
preceding-sibling::*
-
following-sibling::*
-
ancestor::*
-
descendant::*
-
ancestor-or-self::*
-
descendant-or-self::*
Schwieriger wird es, wenn man nur einen bestimmten Bereich auswählen will und nicht alle Knoten bis zum Anfang bzw. Ende der
Achse.
Die Selektion eines Bereichs kann man z.B. beim Strukturieren einer Sequenz aus Überschriften und Paras gebrauchen:
<body> <h1>Überschrift 1</h1> <p>Para 1.1</p> <p>Para 1.2</p> <h1>Überschrift 2</h1> <p>Para 2.1</p> <p>Para 2.2</p> <h1>Überschrift 3</h1> <p>Para 3.1</p> <p>Para 3.2</p> </body>
Die Aufgabe besteht nun darin, jeweils einen
section
-Abschnitt einzuführen, so:
<section> <h1>Überschrift 1</h1> <p>Para 1.1</p> <p>Para 1.2</p> </section> <section> <h1>Überschrift 2</h1> <p>Para 2.1</p> <p>Para 2.2</p> </section> <section> <h1>Überschrift 3</h1> <p>Para 3.1</p> <p>Para 3.2</p> </section>
Ein XSLT Template das dieses Unterfangen bewerkstelligen könnte, sieht bspw. so aus:
<xsl:template match="body"> <xsl:copy> <xsl:for-each select="h1"> <section> <xsl:copy/> <xsl:apply-templates select="following-sibling::*[not(self::h1)] [preceding-sibling::h1[1] is current()]"/> </section> </xsl:for-each> </xsl:copy> </xsl:template>
Hier werden im
apply-templates
Call alle Nachfolger-Knoten ausgehend vom aktuellen Kontextknoten selektiert, die keine Überschriften sind, und die als erste
Vorgängerüberschrift den aktuellen Kontextknoten haben. Das ist genau der Bereich bis zur nächsten Überschrift.