Unabdingbar für eine sinnvolle Verarbeitung von Dokumenten ist die Möglichkeit, abhängig von der Struktur des Dokuments oder inhaltlichen Bedingungen die Formatierung oder Transformation vorzunehmen. XSLT bietet dazu auch drei aus Programmiersprachen bekannte Konstrukte: for-each, if, choose.
xsl:for-each eignet sich dazu, Templates verkürzt zu notieren: in hierarchisch höher angesiedelten Templates. Das nicht-leere Element legt über das Attribut select="..." fest, welche Elemente zu behandeln sind und enthält die Anweisungen für deren Verarbeitung. Der folgende Ausschnitt gibt innerhalb einer HTML-Tabelle die Titel literarischer Werke und ihr Veröffentlichungsjahr sowie den Autorennamen aus.
<!-- XML-Eingabe --> <author id="novalis"> <!-- Auslassungen --> <works genre="novel"> <title>Heinrich von Ofterdingen</title> <year>1802</year> </works> </author> <author id="kleist"> <!-- Auslassungen --> <works genre="drama"> <title>Familie Schroffenstein</title> <year>1803</year> </works> </author> <!-- XSLT-Template --> <xsl:for-each select="author/works"> <tr> <td> <xsl:apply-templates select="year"/> </td> <td> <xsl:apply-templates select="title"/> </td> <td> <xsl:apply-templates select="ancestor::author/name"/> </td> </tr> </xsl:for-each> <!-- HTML-Ausgabe --> <tr> <td>1802</td> <td>Heinrich von Ofterdingen</td> <td> G. F. P. von Hardenberg [Novalis] </td> </tr> <tr> <td>1803</td> <td>Familie Schroffenstein</td> <td> Bernd Heinrich Wilhelm von Kleist </td> </tr>
xsl:if bietet eine
bedingte Verarbeitung von Dokumentteilen. Das Attribut
test="..." prüft, ob ein in ihm enthaltener Ausdruck
wahr ist oder nicht. Ein else
oder elseif
existiert nicht. Nutzbar ist das Konstrukt vielfach, von
Kleinigkeiten wie dem folgenden Beispiel zu komplexeren
Bedingungen wie in Abschnitt 20.1. Das Listing gibt Gedichtstrophen
(Elementname stanza jeweils als Absatz aus, jede
Zeile (Element linemit einem Zeilenumbruch am
Ende — bis auf die letzteGrund für die
englischen Bezeichnungen ist die Tatsache, dass urspünglich
David Megginson die dazugehörige DTD geschrieben hat.
.
<!-- XML-Eingabe --> <stanza id="s1"> <!-- mehr Zeilen --> <line ln="l10">All that we see or seem</line> <line ln="l11">Is but a dream within a dream.</line> </stanza> <!-- XSLT-Templates --> <xsl:template match="stanza"> <p><xsl:apply-templates select="line"/></p> </xsl:template> <xsl:template match="line"> <xsl:apply-templates /> <xsl:if test="not (position()=last())"> <br /> </xsl:if> </xsl:template> <!-- HTML-Ausgabe --> <p> <!-- mehr Zeilen --> <br>All that we see or seem <br>Is but a dream within a dream. </p>
xsl:choose beinhaltet
zwei weitere Elemente: xsl:when
und xsl:otherwise. Die Prüfung
auf Bedingungen erfolgt in xsl:when durch das
Attribut test="..."; xsl:otherwise ist
optional. Wie xsl:if prüft jedes
xsl:when die boolsche Wahrheit des
test-Ausdrucks. Nur der erste wahre Fall wird
abgearbeitet. So lässt sich über ein xsl:when
sowie ein xsl:otherwise ein else
-Zweig
konstruieren. Und mehrere xsl:whens ergeben die
case
-Abfrage. Falls keine der Abfragen den Wert
wahr
ergibt, landet im Ergebnisbaum, was otherwise vorsieht. Der
Abschnitt 20.1 enthält ein längeres
Beispiel; hier zunächst die Syntax:
<xsl:choose> <xsl:when test="position()= 1"> <!-- tue etwas Gutes --> </xsl:when> <xsl:when test="position()=last()"> <!-- tue etwa anderes Gutes --> </xsl:when> <xsl:otherwise> <!-- das Default-Gute --> </xsl:otherwise> </xsl:choose>