Kommentare
Kommentare werden in XSLT geschrieben als
<!-- Kommentar -->
Diese Kommentare werden i.d.R. nicht in die Ausgabe übernommen,
möchten Sie (z.b. für eine leichtere lesbarkeit) Kommentare
in den erzeugten HTML-Text schreiben, müssen Sie die Kommentare
in ein xsl:comment-tag einbetten.
<xsl:comment>< Kommentar, der übernommen wird ></xsl:comment>
xsl:text
Der gesamte Text in der XSL-Datei, der ausgegeben werden soll,
müsste streng genommen in xsl:text - Tags stehen.
Genaugenommen wird er aber auch ausgegeben, wenn er nicht in diesen Tags steht.
xsl:template
*name
Ein Template (zu deutsch: Vorlage) ist das zentrale Element in XSLT:
dort werden alle Tagumwandlungen und Positionierungen vorgenommen.
Beispiel: samples/xslt1.xml und
samples/xslt1.xsl.
--- datei xslt1.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet href="xslt1.xsl" type="text/xsl"?>
<hello-world>
Hallo Welt!
</hello-world>
--- datei xslt1.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Daraus können Sie z.B. mit "saxon -a -o xslt1.html xslt1.xml"
eine HTML-Datei erstellen wenn Sie
Instant Saxon
benutzen.
Erklärung:
xsl:template match="/" wählt sich das tiefste Tag (hello-world), gibt
zuerst einmal <html><body> aus und
"wendet die Templates an". Danach wird noch </body></html> ausgegeben
und die Transformation beendet.
Templates anwenden heißt, dass alle Kind-Tags ausgewertet werden und
Text innerhalb des Tags geschrieben wurde, ausgegeben wird.
Sollte ein Kind-Tag nicht definiert sein, wird
auch dessen Inhalt als Text ausgegeben, das Tag selbst wird jedoch nicht
mehr in der Ausgabe stehen.
Apply-Templates ohne passende Templates
So wird auch bei folgendem Beispiel (sample/xslt2.xml) das
"undefinierte" Tag b nicht
übergeben, der Text nicht fett dargestellt, weil XSLT nicht wissen kann,
dass b als Tag so erhalten bleiben soll.
Hallo <b>Welt</b>!
Ein anderes Tag matchen
Mit einem zweiten xsl:template-Tag können wir auch beliebige andere
Tags bearbeiten - z.B. können wir ein b-Tag kapseln
(samples/xslt3.xml und samples/xslt3.xsl)
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="b">
Fett:<b>
<xsl:apply-templates/>
</b> und wieder normal:
</xsl:template>
Achten Sie immer darauf, in der XML-Datei die gewünschte XSL-Datei anzupassen.
Die Navigation im XML-Dokument ist im Artikel Grundkenntnisse
geklärt - die dortigen XPath-Anweisungen werden Ihnen bei select- und match-
Attributen eine wertvolle Hilfe sein.
xsl:value-of
select
Neben der schon erwähnten Methode
xsl:apply-updates
kann man den Inhalt eines Tags durchaus auch mit value-of
(xsl:value-of select="..."
) ausgeben. Bei der Ausgabe des aktuellen
Taginhaltes in einem Template kann man z.B. <xsl:value-of select="."/>
verwenden.
Der Nachteil: Der Inhalt des Tags wird nicht ausgewertet, sollten also
Tags geschachtelt sein <body> Hallo <b> Welt </b> </body>
würde man bei einem <xsl:value-of select="/body"/> ein Hallo <b> Welt </b> sehen,
auch wenn man an anderer Stelle die Behandlung von b-tags definiert hat.
xsl:value-of
select
Attribute werden in XSLT grundsätzlich mit tagname/@attributname angesprochen,
z.B. img/@src für das src-Attribut eines img-Tags. Mit
<xsl:template match="img">
Bild: <xsl:value-of select="@src"/>
</xsl:template>
kann man dann den Namen eines Bildes ausgeben.
Kurzform einer Ausgabe
Erfolgt die Ausgabe innerhalb von Attributen
kann man anstelle eines value-ofs eine geschweifte Klammer verwenden.
Siehe xslt4.xsl und xslt4.xml.
<xsl:template match="img">
<img src="{@src}" alt="{@alt}"/>
</xsl:template>
Ist etwas eleganter als die längere Lösung (Ein kleiner Tipp: Sie
könnten gar nicht <img name="<xsl:value-of select="."/>"/>
verwenden weil Tags grundsätzlich beendet (nicht geschlossen) sein
müssen wenn man eine XSL:value-of-Ausgabe anfängt.
Sie müssten mit <xsl:element> arbeiten).