XSL

Extended Stylesheet Language

XSL ist eine 'Programmiersprache' zur Erstellung von "Filtern". Mit Hilfe intelligenter Filter werden XML-Daten in (fast) beliebige Ausgabe-Formate umgewandelt. XSL ist ein Mitglied der XML-Familie und daher ein Offener Standard, nicht lizenzpflichtig, und mit allen anderen Mitgliedern der XML-Familie (z.B. HTML) voll kompatibel.
XML Extended Markup Language
Wozu XSL ? Flexible Erzeugung von 'Produkten' aus XML-Daten
XSL-Kompress Kurze Fragen & Antworten zu XSL
Arbeitsprinzip XSL-Programme als Dialog zwischen Suchen & Finden
Start Erzeugung einer statischen Mini-Webseite mit XSL
Dynamisch Erzeugung dynamischer Webseiten aus XML-Daten
Objektgrafik Erzeugung dynamischer Grafik aus XML-Daten
XML+XSL Beispiele Demonstration verschiedener Beispiele: Tabellen, Formulare, Grafik, ...
XSL-Tricks Tipps & Tricks zur XSL-Programmierung
Werkzeug Entwicklungs-Werkzeug
Links Ausgewählte XSL-Links Links zum Thema 'XSL'

Wozu XSL ?


XSL ist ein Standard-Werkzeug zur Umwandlung von XML-Rohdaten in fast beliebige andere Formate.
Das macht die Darstellung variabler (dynamischer) Daten einfacher und schneller.
Aus den gleichen XML-Daten können mit Hilfe von XSL-Programmen unterschiedliche Produkte erzeugt werden.

Für jedes Endprodukt wird ein eigenes XSL-Programm verwendet, das allerdings beliebige XML-Daten verarbeiten kann.
Die Endprodukte werden von XSL als Datenstrom geliefert, nicht als Datei gespeichert. Ein Browser-Programm zeigt den erzeugten Datenstrom an.
Derzeit kann XSL nur Text-Produkte erzeugen. Damit wird allerdings die Mehrheit aller Dokumente (Office, Internet...) erfasst, insbesondere wegen der rasch zunehmenden Bedeutung der XML-Familie.
XSL-Programme arbeiten am Client-PC, d.h. die Erzeugung der jeweiligen Endprodukte erfolgt am AnwenderInnen-PC.
Die XSL-Programme müssen nur einmal geladen werden. Danach werden sie aus dem Cache-Speicher des PC entnommen und verarbeiten beliebige weitere XML-Daten. noch schneller
Dadurch wird der Webserver von der Erzeugung dynamischer Webseiten, dynamischer Grafik usw. vollkommen entlastet.
Der Webserver liefert lediglich die aktuellen Daten, aus ihnen werden am AnwerderInnen-PC die Endprodukte erzeugt.
Auf diese Weise wird die Kapazität der Client-PC besser genutzt, die meist brachliegt, während ein PC auf das Laden einer Webseite wartet.
Dieser Vorgang ist insgesamt wesentlich rascher und effizienter als die Erzeugung dynamischer Produkte am Webserver.
Der große Vorteil von → Daten in XML-Form ist die vollkommene Unabhängigkeit von Zweck und Medium ihrer Verwendung. XSL bietet dazu die ideale Ergänzung: Programmierbare Filter, um XML-Daten für alle denkbaren Anwendungen nutzbar zu machen.

XSL - Kompress

Wozu noch eine Programmiersprache ? XSL ist hoch spezialisiert. Damit werden andere Programmiersprachen nicht konkurriert sondern ergänzt. Moderne Programmiersprachen werden durch eigene XSL-Module ergänzt.
Wozu kann man XSL verwenden ? XSL macht nur Sinn zusammen mit → XML-Daten. Damit lassen sich "rohe" XML-Daten in jede sinnvolle Ausgabe-Form bringen: HTML, WML, SVG, ...
Mit XSL lassen sich u.a. auf höchst effiziente Weise dynamische Webseiten erzeugen.
Was sind XML-Daten ? Das sind "pure" Daten, ohne Layout oder Formatierung. Der offene XML-Standard legt fest, wie diese Daten codiert werden. XML verwendet nur einfachen Text zur Codierung.
Details zu XML-Daten.
Was sind dynamische Webseiten ? Dynamische Produkte (Webseiten, Grafik,...) sind nicht gleichbleibend (statisch), sondern ändern sich je nach den vorliegenden Anforderungen und Daten. Bekannte Beispiele sind die Verwendung von Javascript für interaktive Webseiten, oder die Erzeugung dynamischer Webseiten und Grafik am Webserver (mit → Perl oder → PHP) - weniger bekannt ist der Einsatz von XSL.
XSL ist nicht immer sinnvoll, jedoch wenn man es einsetzt die effizienteste der genannten Methoden.
Was macht XSL mit XML-Daten ? XSL erstellt je nach Programm ein Produkt, z.B. in Form einer Tabelle, in welche die Daten "verpackt" sind. So werden die Daten für die Anzeige auf einer Webseite aufbereitet.
XSL erzeugt Tabellen aus Daten ? Tabellen sind nur eine von unzähligen Möglichkeiten. XSL ist extrem flexibel, kann fast beliebige Ausgabe-Texte erzeugen, gesteuert von den jeweiligen Daten. XSL kann z.B. auch Text oder SVG-Grafik aus Daten erzeugen. Je nach XSL-Programm kann man daher aus den gleichen (!) Daten verschiedene Produkte (Texte, Tabellen, Grafiken, ... ) erzeugen. Es gibt viele prominente, jedoch wenige bekannte Anwendungs-Beispiele: OpenOffice verwendet XSL, um Office-Dokumente in andere Formate umzuwandeln.
XSL erzeugt nur Text-Produkte ? Derzeit kann XSL nur Texte ausgeben. Fast alle modernen IT-Standards verwenden reinen Text (text/plain) zur Codierung, z.B. HTML, die XML-Familie (SVG, MathML, ChemML, RSS, ODF,...), SQL, ...
Welche Software wird benötigt ? XSL-Programme bestehen selbst nur aus reinem Text und können daher mit jedem Text-Editor erstellt werden. Besser sind natürlich spezialisierte Programmier-Werkzeuge.
Auf AnwenderInnen-Seite genügen Browser ohne zusätzliche Software. Alle gängigen Browser in allen Betriebssystemen können XSL problemlos verwenden.

XSL - Arbeitsprinzip

XML-Parser

XSL liest und interpretiert den Text einer XML-Datei.
Solche Programme werden als Parser bezeichnet. Es gibt Parser für viele verschiedene Zwecke, es gibt auch andere XML-Parser als XSL (z.B. in jeder modernen Programmiersprache).
XSL baut aus den gefundenen Anweisungen und Daten einen kompletten hierarchischen Objekt-Baum auf.
Details finden sie unter Stichwort DOM (Document Object Model).
Erst danach wird das eigentliche XSL-Programm auf den vorhandenen Objektbaum angewendet.
Ein XSL-Programm erzeugt als Ausgabe einen DOM-Objektbaum, der an ein Programm (Browser) übergeben wird. XSL erzeugt keinen Quelltext und speichert keine Datei !

Bereits zu Beginn jedes XSL-Programms ist daher der gesamte Element-Baum der XML-Datei bekannt.
Man kann z.B. schon zu Beginn die Anzahl aller Elemente oder die Anzahl bestimmter Elemente erfahren, oder
Man kann die Elemente vor Beginn der Arbeit sortieren.
Bereits vor Bearbeitung jedes einzelnen Elements ist bekannt, wieviele Tochter-Elemente (childnodes) dieses Element hat.
Man muss den Objektbaum der Eingabe-XML-Datei nicht übernehmen. XSL kann selektiv bestimmte Elemente oder Attribute auwählen, andere ignorieren.

templates

Jedes XSL-Programm enthält beliebig viele templates Grund-Einheiten. Ein template ist ein abgeschlossener Block von XSL-Anweisungen und/oder Daten.
Jedes template enthält zu Beginn einen match="" Filter, der angibt, auf welche Elemente oder Attribute das template anzuwenden ist.

In jedem <template></template> Element können Anweisungen und/oder Daten enthalten sein.
Die <xsl: ... > Anweisungen werden ausgeführt, die Daten interpretiert (siehe unten). Achtung - auch ein Text wie z.B. <html> gilt für XSL als 'Daten'.

apply-templates

Wenn XSL auf eine Anweisung <apply-templates> trifft, dann wird nach passenden templates gesucht.
Ein Treffer entspricht ungefähr dem Aufruf eines Unterprogramms, d.h. nach Fertigstellung der gefundenen templates kehrt XSL wieder zur nächsten Anweisung nach <apply-templates> zurück.
Auch für <apply-templates> kann man Filter angeben.
templates werden nur dann ausgeführt, wenn sowohl apply-Filter (Suchen) als auch template-Filter (Finden) zutreffen.

Wenn mehrfache Treffer auftreten, dann bietet XSL Anweisungen zur Regelung dieser Fälle: Man kann die templates nach Priorität reihen und nur das wichtigste ausführen.
Wenn für die gleichen Elemente mehrmals hintereinander templates gesucht werden, dann werden die gleichen Daten mehrmals in unterschiedlicher Form ausgegeben (z.B. auf einer Webseite zuerst als Tabelle, dann als SVG-Grafik).
templates können bei einer darin enthaltenen apply-Suche evtl. auch sich selbst finden, das entspricht dem rekursiven Aufruf von Unterprogrammen.

Daten

Daten sind in diesem Sinne alle Texte in einem XSL-Programm, die nicht als XSL-Anweisungen verstanden werden, z.B. das Wort Text ebenso wie das Element <html>
Daten werden zumindest bei Gefahr der Verwechslung in eine XSL-Anweisung eingeschlossen:
<xsl:text>Daten ..</xsl:text>

Text wird als Text-Knoten in die Ausgabe-Daten übergeben.
Elemente (alle Texte in < > ) werden interpretiert, d.h. XSL versucht, sie in den Ausgabe-Objektbaum einzusetzen.
Verwenden sie daher nur XML-konforme Elemente, z.B. <img .. /><br /> an Stelle von <img .. ><br>

Suchen & Finden

Ein XSL-Programm kann insgesamt als ein Dialog zwischen Suchen (apply-templates) und Finden (template match) verstanden werden.

Programm-Kontrolle

XSL bietet alle wichtigen Anweisungen zur Programm-Kontrolle: Bedingte Verzweigungen, Schleifen und Unterprogramme.

Variable

XSL bietet Variable und Parameter (Steuerung von Unterprogrammen). Allerdings entsprechen die Variablen eher den Konstanten üblicher Programmiersprachen.

Funktionen

XSL bietet eine bescheidene Auswahl an Funktionen.

Start mit XSL

Hier wird die Verwendung von XSL demonstriert, zur Vereinfachung zunächst noch ohne Daten.
Im Rahmen rechts eine minimale, aber komplette HTML-Webseite, auf ihrem PC soeben erzeugt mit XML+XSL.
Das Beispiel wurde in einem <iframe>-Innenrahmen in diese Webseite eingebunden. Im Rahmen wird die Datei demo10.xml angefordert.
Alternativ können sie dieses Dokument auch in einem eigenen Browser-Fenster laden.
Details zu HTML-Rahmen und -Innenrahmen.
<iframe id="if15" src="demo10.xml">
</iframe>
Das verwendete XML-Dokument besteht nur aus der XML-Deklaration und der Anforderung des XSL-Dokuments demo10.xsl
Die 'Daten' bestehen in diesem Minimal-Beispiel aus einem leeren Element <daten>
Das Daten-Element kann beliebige Namen tragen und beliebig viele Daten enthalten, allerdings muss mindestens ein solches Element vorhanden sein.
Wenn sie mit Rechtsklick den Quelltext der erzeugten Webseite anfordern, erhalten sie den Text dieser XML-Datei.
Datei demo10.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="demo10.xsl" type="text/xsl" ?>
<daten></daten>
Rechts das verwendete XSL-Stylesheet. Die Datei enthält ein einfaches 'Programm' zur Erzeugung der Minimal-Webseite.

Die Datei muss - wie jede andere Datei der XML-Familie - mit der XML-Deklaration beginnen.
Danach folgt das <xsl:stylesheet>-Element mit Angabe des verwendeten xmlns Namespace (XML-Befehls-Umfang).
Als nächste Angabe folgt die verwendete Ausgabe-Methode, im Falle einer Webseite ist das html
Danach folgen beliebig viele <xsl:template>-Elemente. Ein template ist ein abgeschlossener Block von XSL-Daten und Anweisungen.
Das Beispiel enthält nur ein einziges template
Die Angabe match="/" bedeutet, den Block immer auszuführen, unabhängig von Art und Anzahl der Daten. Das Zeichen "/" bezieht sich auf das root-Element des XML-Objekt-Baums.
Der Block <xsl:template> ist besonders einfach aufgebaut: Er enthält nur Daten (blaue Schrift) und keine weiteren XSL-Anweisungen.
Die Daten (=HTML-Anweisungen) werden unverändert in den Datenstrom der Ausgabe übernommen, d.h. aus ihnen besteht die angezeigte Webseite.
Datei demo10.xsl
<?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 xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<h3>Diese Webseite wurde mit XSL erzeugt</h3>
</body>
</html>
</xsl:template>

</xsl:stylesheet>
Im nächsten Kapitel wird demonstriert, wie dieses Muster zur dynamischen Anzeige von XML-Daten erweitert wird.

Dynamische Webseiten mit XSL

Dieses Beispiel erzeugt eine Tabelle aus einigen Test-Daten.
Als Live-Nachweis wird die aktuelle Uhrzeit am Server verwendet, im 2. Datensatz die verbleibende Zeit bis Mitternacht.
Sie können dieses Beispiel auch in einem eigenen Browser-Fenster öffnen.
Beachten sie den Quelltext der erzeugten Webseite (Rechtsklick) !
So sieht die verwendete XML-Datei aus:
(alternativ können sie mit Rechtsklick in das Beispiel den Quelltext anzeigen).

Die XML-Daten werden hier nicht von einer Datei geliefert sondern von einem kleinen PHP-Programm.

Hinweis für EntwicklerInnen: PHP muss die XML-Daten im → HTTP-Header mit → MIME-Type text/xml ankündigen.
Rechts der erzeugte Text: Dazu wird die gleiche Datei geladen, lediglich mit dem anderen HTTP-Header text/plain
Das funktioniert mit allen Browsern problemlos, lediglich M$IE erfordert eine Extra-Behandlung wegen jahrelang unbehobener Fehler.
Da die Datei 2mal angefordert wird, können sich die darin enthaltenen (Zeit)-Daten geringfügig unterscheiden.
XML-Daten aus der Datei demo20.php
Das verwendete XSL-Stylesheet ('Programm') beginnt mit der XML-Deklaration, mit der XSL-Deklaration und mit Festlegung der Ausgabe-Methode html

Die XSL-Datei enthält in diesem Fall 2 templates

Das erste template wird wegen der Leerformel match="/" immer ausgeführt.
Hier werden die Grund-Elemente der XHTML-Webseite als Daten (blau) eingetragen. Außerdem wird das Gerüst der <table>-Tabelle angelegt.

An Stelle der Tabellen-Daten (Zeilen & Spalten) befindet sich eine Schleife <xsl:for-each>, die für jedes in den Daten gefundene Element <uhrzeit> einmal durchlaufen wird. Mit <xsl:apply-templates> wird angeordnet, in diesem Fall weitere passende templates anzuwenden.

Das zweite template wird mit dem Filter match="zeit" auf alle gefundenen <zeit>-Elemente angewendet: In diesem Fall wird jeweils eine <tr>-Tabellen-Zeile mit 3 <td>-Spalten angelegt.

Der Inhalt der 3 Zellen wird durch weitere Filter programmiert: In die erste Zelle (Spalte) wird der Inhalt des <std>-Elements geschrieben, usw.
So gelangen die Daten in das XSL-Endprodukt.

Das XSL-Programm befindet sich im Cache-Speicher ihres PC. Es kann beliebig viele weitere XML-Daten verarbeiten und muss dafür nicht mehr übertragen werden. Dasdurch wird die Anzeige variabler (dynamischer) Daten sehr beschleunigt.
Datei demo20.xsl (vereinfacht)
<?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 xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<h3>Daten aus demo20.php</h3>
<table border="1">
<tr><th>std</th><th>min</th><th>sec</th></tr>
<xsl:for-each select="uhrzeit">
<xsl:apply-templates />
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="zeit">
<tr>
<td><xsl:value-of select="std" /></td>
<td><xsl:value-of select="min" /></td>
<td><xsl:value-of select="sec" /></td>
</tr>
</xsl:template>

</xsl:stylesheet>
XSL bietet zahlreiche Optionen für die optimale Anpassung an variable Daten, z.B. bedingte Verzweigungen, Schleifen, Verwendung von Daten und / oder den Namen und Attributen der XML-Elemente, usw. Details zur XSL-Programmierung finden sie u.a. beim W3C-Konsortium.

Werkzeug zur Entwicklung mit XSL

XSL erfordert zur Entwicklung mindestens eine Datei mit XML-Daten und ein XSL-Stylesheet. Die Ziel-Anwendung ist fast immer eine Webseite oder ein Teil davon. Das ausführende Programm ist daher ein beliebiger Browser.
Wenn der Browser jedoch nicht das gewünschte Ergebnis anzeigt, dann kann das Debuggen schwierig werden: XSL erzeugt keinen Quelltext, sondern einen Objektbaum, das Ergebnis wird nicht (als Datei) gespeichert, sondern als Datenstrom an den Browser übergeben. Eine Möglichkeit, den von XSL erzeugten Quelltext zu erfassen bieten XSL-Parser, z.B. InstantSaxon (Neuere Versionen im Internet, Download Version >=5.3).

xsltproc:

Die meisten Linux-Distributionen enthalten dieses → Shell-Konsolen Programm oder laden es auf Mausklick aus ihrem Repository (Software-Pool des Distributors).
Hilfe zum Programm:
# man xsltproc
Ohne weitere Angaben erfolgt die Ausgabe von Text-Produkten an die Konsole. Erzeugung eines Produkts aus einer XML-Datei, in welcher das XSL-Stylesheet bereits angegeben ist:
# xsltproc demo.xml

Ausgabe eines Produkts aus explizit angegebenen XSL- und XML-Dateien:
# xsltproc demo.xsl demo.xml
Erzeugung einer Datei (hier demo.html) aus dem Produkt:
# xslt --output demo.html demo.xsl demo.xml

http://xmlsoft.org/XSLT

Saxon:

XSL-Testprogramm für Windows-Systeme.
In mehreren Versionen verfügbar, die Home Edition (HE) ist kostenfrei.
Entpacken sie das Archiv und kopieren sie das Windows-Programm saxon.exe in ein Test-Verzeichnis, z.B. C:\saxon\saxon.exe
Kopieren sie mindestens je eine XML- und XSL-Datei dorthin.
Starten sie eine DOS-Konsole.
Anzeige der integrierten Hilfe:
C:\saxon> saxon
Erzeugung eines Produkts aus XML+XSL:
C:\saxon> saxon demo.xml demo.xsl
Wenn keine Output-Datei angegeben wurde, dann wird der von XSL erzeugte Text im DOS-Fenster angezeigt.
Neuere Versionen verwenden Java.
Saxon (SourceForge Projektseite), Saxonica,

Firebug

ist ein kostenfreies Plugin (Zusatz-Programm) für den Firefox Browser. Damit kann man die DOM-Struktur geladener Dokumente anzeigen.

Das kleine Programm eignet sich besonders gut zum Debuggen von Produkten, die mit XML+XSL hergestellt wurden.

Ausgewählte Links zum Thema 'XSL'

Standards und Hersteller:

XSL-Homepage beim W3C

Mozilla @ XSL - Info & Beispiele
Mozilla - Javascript @ XSL
Tutorials & Beispiele:
Zvon (alles auch zum Download !): References ( XSLT, XSL FO), Tutorials (XSLT), Download
Apache XSL Documentation
XML/XSL-Portal von Chris Bayes
Saxon (Sourceforge): XSL Elements, XPath Expressions, XSLT Patterns, Standards Conformance

XHTML CSS