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.
Previous Page Next Page
Version: 93
Jan 25 2021