Die bislang als Beispiele vorgekommenen Templates haben es bereits angedeutet: XSLT bietet einiges für die Konstruktion des Ergebnisbaums an. Die folgende Tabelle enthält eine Reihe von Elementen, die dazu dienen.
Element | Was es im Ergebnisbaum erzeugt | Beispiel |
---|---|---|
xsl:element | Ein Element | <xsl:element name="a"> [...] </xsl:element> |
xsl:attribute | Ein Attribut | <xsl:attribute name="href"> [...] </xsl:attribute> |
xsl:attribute-set | Eine Menge von Attributen | <xsl:attribute-set> [Attribute wie oben] </xsl:attribute-set> |
xsl:text | Text, auch Leerraum | <xsl:text> [...] </xsl:text> |
xsl:processing-instruction | Eine Verarbeitungsanweisung | <xsl:processing-instruction name="php"> [PHP-Kommando] </xsl:processing-instruction> |
xsl:comment | Ein Kommentar | <xsl:comment> [Text des Kommentars] </xsl:comment> |
xsl:copy | Kopiert den gegenwärtigen Knoten | <xsl:copy> <xsl:apply-templates select="."/> </xsl:copy> |
xsl:value-of | Text, der aus dem Inhalt von Elementen oder den Werten von Attributen bestehen kann | <xsl:value-of select="."/> |
Nummerieren | ||
xsl:number | (Formatierte) Zahl/Ziffer | <xsl:number value="position()" format="1. "/> |
Schleifen, Abfragen | ||
xsl:for-each | for-each-Schleife, entsprechend einem select-Attribut | <xsl:for-each select="person"> [gib Namensliste aus] </xsl:for-each> |
xsl:if test="..." | Bedingte Ausgabe von Text oder Elementen | <xsl:if test="position()=1"> [an Position1 etwas tun] </xsl:if> |
xsl:choose test="..." | Fallbedingte Ausgabe von Text oder Elementen über xsl:when und xsl:otherwise | <xsl:choose> <xsl:when test="a">b</xsl:when> <xsl:otherweise>c</xsl:otherwise> </xsl:choose> |
Sortieren | ||
xsl:sort | Sortierte Ausgabe von Elementen innerhalb von apply-templates | <xsl:apply-templates> <xsl:sort select="nachname"/> </xsl:apply-templates> |
Variable, Parameter | ||
xsl:variable | Variablendeklaration und -zuweisung | <xsl:variable name="dir"> [Verzeichnis] </xsl:variable> |
xsl:param | Parameterdeklaration, dem Stylesheet von außen mitgegeben | <xsl:param name="dir"/> |
xsl:copy-of | Kopiert das Resultat des Ausdrucks in den Ergebnisbaum (als Knoten; nicht in Zeichenkette konvertiert wie bei xsl:value-of | <xsl:copy-of select="."/> |
xsl:with-param | Parameterzuweisung an Schablonen | <xsl:template match="wasdenn"> <xsl:with-param name="dir">html</xsl:with-param> </xsl:template> |
Das sind zwar noch nicht alle Hilfsmittel, aber für den Anfang sollte es reichen (eine vollständige Liste ist in Anhang D.3 zu finden)
Viele der aufgeführten Elemente sind wahrscheinlich selbsterklärend. Dennoch sollen ein paar Kürzestbeispiele zeigen, wie sie im Einzelnen zu benutzen sind. Häufig vorkommen dürfte etwa xsl:attribute, nicht zuletzt bei Bildern und einfachen Links:
<!-- Bild --> <img> <xsl:attribute name="src">/images/logo.jpg</xsl:attribute> <xsl:attribute name="alt">logo</xsl:attribute> <xsl:attribute name="hspace">20</xsl:attribute> </img> <!-- Bild-Ergebnis --> <img src="/images/logo.jpg" alt="logo" hspace="20"> <!-- Link --> <a> <xsl:attribute name="href">http://xyz.de/</xsl:attribute> <xsl:text>Zurück zur XYZ Site</xsl:text> </a> <!-- Link-Ergebnis --> <a href="http://xyz.de/">Zurück zur XYZ Site</a>
Über eine Zuweisung, wie hier vorgenommen, hinaus ergeben sich leider keine weiteren Möglichkeiten, denn xsl:attribute lässt sich nicht als leeres Element benutzen; es besteht nicht die Möglichkeit, per select-Ausdruck den Wert des Attributs zu setzen. Das sieht die XSLT-Spezifikation nicht vor. Proprietäre Implementierungen können derlei natürlich vorsehen, und Saxon tut das tatsächlich.
Zusammenstellungen von Attributen (attribute-set) wiederum lassen sich gut nutzen, wenn es darum geht, ein Element zu generieren, dem man gleich die Attribute en bloc zuweisen will (vor allem dann, wenn man die Attributmenge des öfteren benötigt). Diese Sets haben einen Namen, über den sie ansprechbar sind.
<!-- Definition der Attributmenge --> <xsl:attribute-set name="my-img-set"> <xsl:attribute name="hspace">20</xsl:attribute> <xsl:attribute name="vspace">20</xsl:attribute> </xsl:attribute-set> <!-- Verwendung der Attributmenge --> <xsl:template match="//img"> <xsl:copy xsl:use-attribute-sets="my-img-set"> <xsl:apply-templates/> </xsl:copy> </xsl:template> <!-- Ergebnis --> <img src="..." alt="..." hspace="20" vspace="20">
weist allen Abbildungen (img) generell einen Abstand zu (hspace und vspace), unabhängig davon, wo im Dokument sie vorkommen (wegen des doppelten Schrägstrichs). Außerdem nutzt dieses Template gleich noch xsl:copy, das den Knoten img in den Ergebnisbaum kopiert. Vorausgesetzt ist hier, dass apply-templates dafür sorgt, dass auch die im Quellelement vorhandenen Attribute sich im Ergebnisbaum wiederfinden (src/alt/width/height), denn sie wie auch die Kindelemente berücksichtigt der Kopiervorgang nicht.
Text einfach auszugeben ist einfachHier
unterscheidet XSLT sich ausnahmsweise nicht von
DSSSL, denn (literal "Warning: ") ist
nicht komplizierter als <xsl:text>Warning:
</xsl:text>. Aber was als Text in
Elementen des Ergebnisbaums landet, lässt sich auf
verschiedene Weise be
rechnen
. Dazu dienen die
Ausdrücke, wie wir sie bereits in Kapitel 7 behandelt haben.
<!-- XML-Eingabe --> <airline code="MVOA" longname="My Very Own Airline"> ... </airline> <!-- Wertzuweisung --> <h1> <xsl:value-of select="@longname"/> </h1> <!-- HTML-Ausgabe --> <h1>My Very Own Airline</h1> <!-- ================================ --> <!-- XML-Eingabe (hier XHTML) --> <div>[...]</div> <!-- Wertzuweisung --> <div> <xsl:attribute name="id"> <xsl:text>div</xsl:text> <xsl:value-of select="position()"/> </xsl:attribute> <xsl:apply-templates/> </div> <!-- funktioniert so nur, wenn die div-Elemente alle auf derselben Hierarchieebene sind --> <!-- HTML-Ausgabe --> <div id="div42">[...]</div> <!-- ================================ --> <!-- XML-Eingabe --> <abbildung> <quelle>datei.jpg</quelle> <format breite="200" hoehe="250"/> </abbildung> <!-- Variablenzuweisung --> <xsl:variable name="dir">grafik</xsl:variable> <xsl:template match="abbildung"> <img src="{$dir}/{quelle}" width="{format/breite}" height="{format/hoehe}"/> <xsl:template> <!-- HTML-Ausgabe --> <img src="grafik/datei.jpg" width="200" height="250"/>
Die erste der beiden Wertzweisungen schreibt den
Wert eines Attributs (longname), die zweite
versieht jedes Element div mit dem Attribut
id, dessen Wert sich aus den Zeichen div
sowie der mit Hilfe von xsl:value-of berechneten
Position des Elements im Dokument zusammensetzt. Da nicht
zwei Elemente derselben Art dieselbe Position einnehmen
dürfen, ist die Eindeutigkeit der
id gewährleistet. Die Variablenzuweisung bekommt
ihre Bedeutung natürlich erst dort, wo sie genutzt wird. In
diesem Fall dient sie dazu, für alle Abbildungen
festzulegen, in welchem Verzeichnis sie sich
befinden.
Im dritten Beispiel wird das HTML-Element img aus einer Variablen für das Verzeichnis und den in abbildung enthaltenen Elementen und Attributen zusammengesetzt.