xsl:iterate
Das Konstrukt xsl:iterate kann genutzt werden, um viele Elemente des selben Typs mit den gleichen Anweisungen anzusteuern. Beispielsweise soll für alle Angestellten einer Firma das Gehalt ausgelesen werden, um am Ende das Durchschnittsgehalt zu ermitteln. Das heißt innherhalb des Root-Elements liegen beliebig viele person-Elemente, über welche iteriert wird und dabei das betreffende Attribut gehalt ausgelesen wird.
Im Folgenden wird zunächst auf den Aufbau des Konstrukt xsl:iterate eingegangen und die einzelnen Bestandteile werden erklärt. Des Weiteren ist ein kleines Einführungsbeispiel zu finden. Als Referenz hierfür wurde der XSLT 3.0-Standard verwendet.
Das Konstrukt xsl:iterate ist wie folgt aufgebaut:
Code-Beispiel: xsl:iterate-Grundgerüst.
<xsl:iterate select = Ausdruck >
<xsl:on-completion select = Ausdruck > </xsl:on-completion>
<xsl:break select = Ausdruck > </xsl:break>
<xsl:next-iteration> </xsl:next-iteration>
</xsl:iterate>
Zeile 1: Das Attribut select der xsl:iterate-Anweisung ist Pflicht und enthält einen XPath-Ausdruck, um eine Input-Sequenz zu erstellen. Als Inhalt der xsl:iterate liegt die Sequenz-Anweisung. Diese wird einmal für jedes Element der Input-Sequenz ausgewertet. Das geschieht solange, bis die Schleife alle Elemente abgearbeitet hat oder ein xsl:break-Element zutrifft, je nachdem welches Ereignis zuerst stattfindet.
Zeile 2: Das xsl:on-completion-Element ist optional und muss, wenn es eingesetzt wird, gleich zu Beginn im xsl:iterate-Element stehen. Entweder hat das xsl:on-completion-Element ein select-Attribut oder Kind-Elemente. Beides gleichzeitig ist nicht erlaubt!
Zeile 3: Optionale Anweisung, welche die Schleife vorzeitig terminieren lässt. Das select-Attribut sowie der Inhalt des Elements sind ebenfalls optional. Allerdings kann entweder ein select angegeben werden oder das Element xsl:break Kind-Elemente enthalten. Beides gleichzeitig ist nicht erlaubt!
Zeile 4: Über das Konstrukt xsl:next-iteration können beispielsweise aktuelle Parameterwerte für den nächsten Schleifendurchlauf auf bestimmte Werte gesetzt werden.
Achtung!
Da hier xsl:iterate in Verbindung mit Streaming genutzt wird, ist der Aufruf der Methode last nicht erlaubt. Beim Streaming wird immer nur ein Element nach dem anderen verarbeitet, ohne dabei Zugriff auf das nächste Element mit next zu haben. Aus diesem Grund ist es nicht möglich zu wissen, wann das letzte Element verarbeitet wird.
Als Beispiel liegt die folgende XML-Datei vor. Diese Datei bildet beliebig viele Transaktionen eines Bankkontos ab. Für jede Buchung wird sowohl das Datum als auch der Geldbetrag gespeichert. Mit einer Transformation soll nun unter Zuhilfenahme von xsl:iterate eine neue XML-Datei erstellt werden, welche nach jeder Transaktion den aktuellen Kontostand enthält. Siehe das Code-Beispiel Einführungsbeispiel zu xsl:iterate - Output (Account-XML-Datei).
Code-Beispiel: Einführungsbeispiel zu xsl:iterate - Input (Transaktions-XML-Datei).
<transactions>
...
<transaction date="2008-09-01" value="12.00"/>
<transaction date="2008-09-01" value="8.00"/>
<transaction date="2008-09-02" value="-2.00"/>
<transaction date="2008-09-02" value="5.00"/>
</transactions>
Aufbau der Transaktions-XML-Datei.
Zeile 1: Alle zu einem Bank-Account gehörenden Transaktionen sind hier aufgelistet.
Zeile 2: Es sind beliebig viele transaction-Elemente möglich.
Zeile 3: Die zu einer Transaktion gehörende Attribute Datum (date) und Wert (value).
Code-Beispiel: Einführungsbeispiel zu xsl:iterate - Output (Account-XML-Datei).
<account>
<balance date="2008-09-01" value="12.00"/>
<balance date="2008-09-01" value="20.00"/>
<balance date="2008-09-02" value="18.00"/>
<balance date="2008-09-02" value="23.00"/>
</account>
Aufbau der Account-XML-Datei.
Zeile 1: Das durch die Transformation erstellte Root-Element account.
Zeile 2: Für jedes transaction-Element wurde durch xsl:iterate ein balance-Element erzeugt.
Um die Umwandlung der Transaktions-XML in die Account-XML zu erreichen, wird die folgende XSLT-Transformation geschrieben:
Code-Beispiel: Einführungsbeispiel zu xsl:iterate - XSLT.
<account>
<xsl:stream href="transactions.xml">
<xsl:iterate select="transactions/transaction">
<xsl:param name="balance" select="0.00" as="xs:decimal"/>
<xsl:variable name="newBalance" select="$balance + xs:decimal(@value)"/>
<balance date="{@date}" value="{$newBalance}"/>
<xsl:next-iteration>
<xsl:with-param name="balance" select="$newBalance"/>
</xsl:next-iteration>
</xsl:iterate>
</xsl:stream>
</account>
XSLT, um die Transaktions-XML in die Account-XML zu transformieren.
Zeile 1: Erstellung des Root-Elements für die untergeordneten in xsl:iterate erstellten balance-Elemente.
Zeile 3: Beginn der Iterationsschleife über den angegebenen Parameter in select="transactions/transaction". Es wird über alle transactions-Elemente iteriert.
Zeile 4: Anlegen eines neuen Parameters mit dem Namen balance. Der Typ ist xs:decimal.
Zeile 6: Zu einer Transaktion gehörende Attribute Datum (date) und Wert (value).
Übung zu xsl:iterate
- Temperaturkurve Stuttgart 2015 (Übung 9)
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |