XSL-Tricks

Einige praktische XSL-Beispiele

Auf dieser Seite werden XSL-Beispiele vorgestellt, die sich aus didaktischen Gründen bewährt haben. Jedes Beispiel zeigt Live einige spezielle Aspekte für die Anwendung von XSL
XSL Extended Stylesheet Language
Quelltext Ein XSL-Programm erzeugt Quelltext aus einer XML-Datei
Einige interessante Tricks werden in den → XSL-Beispielen angewendet, jedoch hier noch nicht einzeln kommentiert...

Source-Generator

Rechts ein kleines Beispiel von XML-Daten:
3 Datensätze, einige der Daten mit Attributen.

Der Source-Generator gibt den XML-Quelltext auf einer Webseite aus.
Interessante Details:

XSL-Filter für alle Elemente und für alle Attribute

Das Programm arbeitet mit jeder XML-Datei, kommt also ohne Kenntnis der verwendeten Elemente und Attribute aus.

Das Beispiel hat sich aus einem der vielen Fehler des M$IE-Browsers ergeben; Alle modernen Browser zeigen den Quelltext einer (XML)-Datei korrekt an, wenn man die → MIME-Type text/plain angibt. M$IE ignoriert das hartnäckig, wird aber u.a. mit diesem XSL-Generator bezwungen.
Quelltext der XML Test-Datei
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="source_generator.xsl" type="text/xsl" ?>
<daten>
<zeile>
<name sex="w">Anna</name><wert mark="min">56</wert>
</zeile>
<zeile>
<name sex="m">Rudi</name><wert mark="max">78</wert>
</zeile>
<zeile>
<name sex="w">Doris</name><wert>67</wert>
</zeile>
</daten>
Dieses XSL-Programm erbeitet mit 3 Templates:

Das <xsl:template match="/"> erzeugt eine kleine Webseite. Durch Änderung der CSS-Styles tag, att und dat können sie die Darstellung nach Bedarf anpassen.
In einer <xsl:for-each> Schleife werden templates für alle gefundenen Elemente select="." gesucht.

Das <xsl:template match="*"> passt auf jedes Element.
Ein Element <tag> muss für HTML als &lt;tag&gt; ausgegeben werden. Die HTML-entities sind in XML unbekannt, daher wird das Äquivalent &#x003C;tag&#x003E; verwendet (funktioniert auch in reinem HTML).
Der Name des Elements wird von XSL-Funktion name() geliefert.
Vor dem Abschluss des tags müssen noch die Attribute eingefügt werden. Attribute werden mit @ vor ihrem Namen angesprochen, daher werden mit select="@*" templates für alle Attribute gesucht.
Innerhalb jedes Elements können sich beliebig viele Daten oder child-Elemente befinden. Die CSS-Klasse class="ind" sorgt für die Einrückung des Textes, die XSL-Schleife sucht mit select="." nach templates für alle Elemente. Bei jedem Treffer wird rekursiv das gleiche template ausgeführt.

Das <xsl:template match="@*"> passt auf jedes Attribut.
Das entity &#x00A0; erzeugt ein &nbsp; (non-breakable space) vor jedem Attribut, das in der Form name="wert" ausgegeben wird.
Die XSL-Funktion name() liefert den Attribut-Namen, "." den Wert.
Die beiden double-quotes werden mit entity &#x0022; ausgegeben.

Tipp: Die Ausgabe wird besser, wenn einige Zeilen des XSL-Quelltextes zusammengefasst werden. In diesem Fall werden die dabei automatisch ausgegebenen Leerzeichen unterdrückt.
XSL Source Generator
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "html" />

<xsl:template match="/">
<html>
<head>
<style type="text/css" media="screen">
/* <![CDATA[ */
body,div,spab,td,{font-family:'Courier New',Courier,mono; font-size:10pt;}
.ind{margin-left:20px;}
.tag{color:#000;}
.att{color:#0C0;}
.dat{color:#00F;}
/* ]]> */
</style>
</head>
<body>
<div style="font-weight:bold; color:#C00;">XSL Source generator</div>
<div class="dat">
<xsl:for-each select=".">
<xsl:apply-templates />
</xsl:for-each>
</div>
</body>
</html>
</xsl:template>

<xsl:template match="*">
<div class="tag">&#x003C;
<xsl:value-of select="name()"/>
<xsl:apply-templates select="@*"/>
&#x003E;</div>
<div class="ind">
<xsl:for-each select=".">
<xsl:apply-templates />
</xsl:for-each>
</div>
<div class="tag">
&#x003C;/<xsl:value-of select="name()"/>&#x003E;
</div>
</xsl:template>

<xsl:template match="@*">
<span class="att">&#x00A0;<xsl:value-of select="name()"/>
=&#x0022;<xsl:value-of select="."/>&#x0022;</span>
</xsl:template>

</xsl:stylesheet>

Live-Ausgabe

Im Innen-Rahmen rechts wird das Produkt angezeigt, das soeben live von ihrem Browser erzeugt wurde.
Das Produkt ist keine reine Text-Ausgabe:
Der gesamte XML-Element-Baum wird analysiert und seine Struktur neu formuliert - unabhängig von der Anordnung (z.B. Zeilen, Tabulatoren, Leerzeichen) im Quelltext.
Ausgabe für dieses Beispiel: