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 Aus­drü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 Sequenzrei­henfolge 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 weiterver­arbeitet 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-Elemen­ten 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 Bestellvor­gangs der jeweilige Preis und die Menge entnommen, miteinander multipli­ziert 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 wesent­lich 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 Weiterver­arbeitung 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 gebun­den sein. Die einzelnen Bindungen werden durch Komma getrennt hinterein­ander 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 Eingangssequen­zen 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 ausge­wertet 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) for­muliert 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-Aus­drü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