Schleifenausdrücke mit for
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 4.)
Keywords: for, in, return
Zu den in XPath 2.0 nützlichsten neuen Ausdrücken gehört die for-Schleife, mit der eine Sequenz Item für Item verarbeitet werden kann. Hierfür wird jedes Item fortlaufend an eine temporäre Variable gebunden:
for $x in $eingabesequenz
return $ergebnisausdruck
Hierbei wird eine einzelne temporäre Variable $x auch als Range Variable (in etwa Bereichsvariable) bezeichnet.
Für jedes Item $x der übergebenen Sequenz $eingabesequenz wird der Return-Ausdruck $ergebnisausdruck ausgewertet, in den in der Regel der aktuelle Wert von $x eingeht. Alle so erzeugten Werte werden in Sequenzreihenfolge verkettet und als Gesamtergebnis zurückgegeben.
Ähnliches kann mit der XSLT-Instruktion xsl:for-each erzielt werden, jedoch gibt die for-Schleife in XPath unmittelbar eine Sequenz zurück, die weiterverarbeitet werden oder Teil anderer XPath-Ausdrücke sein kann. Das Ergebnis einer xsl:for-each-Instruktion könnte dagegen höchstens in eine Variable oder direkt in ein Ergebnisdokument ausgegeben werden.
Schleife über eine Nodesequenz
Für eine Nodesequenz kann zum Beispiel eine Berechnung über alle Mitglieder der Sequenz vorgenommen und die Werte hierfür können aus Child-Elementen der jeweiligen Items entnommen werden:
for $x in /bestellung/ware
return
$x/preis * $x/menge
In diesem Beispiel wird für jede Ware eines in XML dargestellten Bestellvorgangs der jeweilige Preis und die Menge entnommen, miteinander multipliziert und als Sequenz atomarer Werte zurückgegeben.
Die Gesamtsumme der Bestellung kann nun sehr einfach ermittelt werden, indem man den oben gegebenen Ausdruck als Argument der Funktion fn:sum() einsetzt:
fn:sum(for $x in /bestellung/ware
return
$x/preis * $x/menge)
Eine vergleichbare Lösung ist in XPath 1.0 und XSLT 1.0 ebenfalls darstellbar, aber wesentlich umständlicher. Zwar kann, wie oben angedeutet, das Ergebnis einer xsl:for-each-Instruktion in eine Variable umgeleitet werden. Es liegt dort aber nicht als Nodeset, sondern als (für XPath 1.0 unzugängliches) Result Tree Fragment vor. Zu dessen Weiterverarbeitung muss daher bereits auf eine Erweiterungsfunktion zurückgegriffen werden, die in der Lage ist, dieses in einen Nodeset umzuwandeln. Ein Beispiel hierfür wäre die EXSLT-Funktion exsl:node-set().
For-Schleife mit mehreren gebundenen Variablen
Innerhalb eines for-Ausdrucks können auch zwei oder mehr Variablen gebunden sein. Die einzelnen Bindungen werden durch Komma getrennt hintereinander geschrieben:
for $x in $sequenz_1,
$y in $sequenz_2
return $x + $y
Es handelt sich jedoch nur scheinbar um eine Schleife mit mehreren Variablen – intern wird eine solche Schleife für n gebundene Variablen in n ineinander verschachtelte for-Schleifen aufgelöst. Unser einfaches Beispiel ergibt also:
for $x in $sequenz_1
return for $y in $sequenz_2
return $x + $y
Folgender Ausdruck erzeugt eine Zahlensequenz, die aus zwei Eingangssequenzen errechnet wird:
for $i in (10, 20, 30), $j in (1, 2, 3)
return ($i + $j)
Das Ergebnis ist die Sequenz: 11,12, 13, 21, 22, 23, 31, 32, 33.
Eine gebundene Variable kann im Inneren einer verschachtelten Schleife ausgewertet werden:
for $a in distinct-values(//autor)
return ($a,
for $b in //buch[autor = $a]
return $b/titel)
Dieser Ausdruck entnimmt einer als XML-Dokument dargestellten Buchliste zunächst alle unterscheidbaren Autor-Elemente in Dokumentreihenfolge und benutzt die so generierte Sequenz, um ein Predicate für die Eingangssequenz der innen liegenden Schleife zu bilden. Diese sucht zu jedem Autor die Titel seiner Bücher heraus, wie sie in Dokumentreihenfolge vorliegen.
Seitenblick – die mächtigere for-Expression in XQuery
Der for-Ausdruck in XPath stellt nur eine Teilmenge des in XQuery implementierten for-Ausdrucks dar. In XQuery kann innerhalb einer for-Schleife eine Sortierung erfolgen (order by), es können Variablen deklariert (let) und zusätzliche Bedingungen (where) formuliert werden. Dies ist in der in XSLT verwendbaren XPath-Untergruppe dieses Ausdrucks nicht möglich.
Rückblick auf XPath 1.0
In XPath 1.0 existiert innerhalb von XPath-Ausdrücken kein zur for-Schleife analoges Konzept. Die Verwendung von xsl:for-each und Variablen ist alternativ möglich, aber umständlicher und weniger flexibel.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XPath 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