Alternative in XPath: for - in - return

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 2.)

Ähnlich wie Bedingungen als reine XPath-Ausdrücke realisiert werden können, ist dies auch bei Schleifen der Fall. Eine direkte Sortierung ist jedoch nicht möglich, denn ein hierfür erforderliches Statement existiert in XPath nicht. Mit dem vorhandenen ist allerdings schon einiges machbar.

Eine XPath-Schleife hat die Struktur:

for $variable in eingabesequenz return rueckgabeausdruck

Die Variable, die nach dem for-Statement deklariert wird, ist eine lokale Vari­able, die für jeden Durchlauf der Schleife instanziiert wird. Die Zahl der Durch­läufe wird durch die Zahl der Items in der durch den XPath-Ausdruck nach dem in-Statement erzeugten Sequenz bestimmt. Die Variable erhält für jeden Durchlauf das aktuelle Item als Wert und kann (muss jedoch nicht) im Rückga­beausdruck referenziert werden.

Hier ein einfaches Beispiel, das Zahlen eines Bereiches von 1 bis 10 nacheinander in eine Variable $zahl ablegt, quadriert und als Sequenz zurückgibt. Zur Definition des Bereichs dient der to-Operator:

<xsl:value-of select="for $zahl in (1 to 10) return $zahl * $zahl"/>

Das Ergebnis lautet:

1 4 9 16 25 36 49 64 81 100

Es können problemlos zwei oder mehr Variablen in einem Statement verwendet werden:

<xsl:value-of select="for $zahl_1 in (1 to 10), $zahl_2in (11 to 20) return $zahl_1 + $zahl_2"/>

Dies gibt folgende Zahlenreihe aus:

2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 12 4 5 6 7 8 9 10 11 12 13

Auch auf das Buchhandelsbeispiel ist die XPath-Schleife anwendbar. Die lokale Variable $i erhält diesmal eine Nodesequenz, die sukzessive abgearbeitet wird und als allen Elementen <buch> in <buchhandel> besteht. Hier werden alle Buchtitel ausgegeben – dies jedoch »ohne Punkt und Komma«:

<xsl:template match="/">
  <html>
    <head>
      <title>Buchhandel</title>
    </head>
    <body>
      <h2>Mein XML-Buchhandel</h2>
      <p><xsl:value-of select="for $i in buchhandel/buch return $i/buchtitel"/></p>
    </body>
  </html>
</xsl:template>

Die zusätzliche Ausgabe von Tags in der Schleife ist auch mit Tricks nicht mög­lich. Mit der Modifikation des separator-Attributwerts wird dies zwar besser, der Preis besteht jedoch in dem für xsl:value-of ebenfalls zu setzenden disable-output-escaping:

<xsl:value-of separator="&lt;br/&gt;" disable-output-escaping="yes" select="for $i in buchhandel/buch return $i/buchtitel"/>
 

Hiermit erhält man immerhin:

Where Wizards Stay Up Late
Yet Another Hitchhiker's Guide to the Galaxy
Unter Korallen und Haien

Allerdings werden eventuelle Umlaute in Buchtiteln nicht durch HTML-Entities umschrie­ben.

Insgesamt ist die XPath-Schleife als direkter Ersatz für xsl:for-each nicht unmittelbar bzw. nur mit Einschränkungen einsetzbar. Ihre Stärke kann sie jedoch ausspielen, wenn es sich um die Rückgabe einer in der Schleife erzeug­ten Sequenz aus berechneten Werten handelt

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn