eXtensible Stylesheet Language

13.03.2001 von Holger Reibold
Wer die Vorzüge von XML richtig ausschöpfen möchte, benötigt eine Technik, die XML-basierte Dokumente für die unterschiedlichsten Plattformen aufbereitet. Das ist die zentrale Aufgabe von XSL. XSL kann aber noch mehr.

Eine der herausragenden, vielleicht sogar die herausragende Eigenschaft von XML ist die Trennung von Inhalt und Darstellung. Diese Trennung vereinfacht die Verwendung von Datenfragmenten oder auch ganzen Dokumenten für unterschiedliche Plattformen, etwa für Internet-Browser, WAP oder andere Medien.

Ist diese Technik in einem Unternehmen erfolgreich implementiert, können beispielsweise Lagerbestände mit vergleichsweise geringem Aufwand für einen Online-Shop, einen traditionellen Katalog und auch für den (auszugsweisen) Austausch mit Lieferanten aufbereitet werden. XML ist so konzipiert, dass es die Ausgabe für alle erdenklichen Medien vereinfacht. Prinzipiell wird es auch möglich sein, die Eigenschaften der darstellenden Plattform oder die Vorlieben des Konsumenten zu berücksichtigen. An diesem Punkt setzt XSL (eXtensible Style Language) an, denn diese Aufbereitung soll XML nicht leisten.

XSL-Grundlagen

XSL stellt zwei Funktionen bereit: Neben dem Transformationsmechanismus verfügt XSL über einen Formatsprachschatz. Der bislang wichtigste Aufgabenbereich ist die Transformation. XSL definiert hierfür die Mechanismen, wie bestehende XML-Dokumente in neue Dokumente transformiert werden. Das transformierte Dokument kann dabei die Markierungen und die DTD des ursprünglichen Dokuments oder völlig andere Tag-Sets verwenden.

Die beiden XSL-Funktionen Transformation und Formatierung funktionieren unabhängig voneinander. So kann beispielsweise der Transformationsmechanismus ein XML-Dokument in ein HTML-Dokument konvertieren und dabei das XSL-Formatobjekt völlig ignorieren - wie man es etwa vom Internet Explorer 5.x kennt.

Komponenten von XSL

Beim Einsatz von XSL kommen unterschiedliche Technologien zum Tragen. Bei der Beschreibung von XSL unterscheidet man in der Regel drei Komponenten:

Für alle jene, die sich das erste Mal mit XSL auseinander setzen, mag das scheinbare Durcheinander bei der Verwendung der Akronyme XPath, XSLT und XSL irreführend wirken. Bis zur Vorlage der aktuellen XSL-Spezifikation wurden XPath, XSLT und XSL in jeweils eigenen Spezifikationen definiert. Das hat sich mit der aktuellen XSL-Spezifikation geändert, die dem Ganzen einen logischen Rahmen gibt.

Schnelleinstieg in die XSL(T)-Entwicklung

XML-Dokumente bestehen aus einer baumförmigen Struktur. Die Datenstruktur weist Knoten (Nodes) auf, die mit der Root beginnen. Jeder dieser Knoten kann selbst wieder Nodes enthalten. Die Äste eines XML-Baumes sind Elemente und deren Inhalte. Aus Sicht eines Stylesheets müssen auch Attribute, Namensräume, Verarbeitungsanweisungen und Kommentare als Äste betrachtet werden. Für den XSL-Prozessor besteht ein XML-Baum also aus sieben Ästen: Root, Elemente, Text, Attribute, Namensräume, Anweisungen und Kommentare.

Die zentrale Rolle für den Umwandlungsprozess spielen die Template-Regeln, die in einem XSL-Dokument enthalten sind. Eine Template-Regel beinhaltet so genannte Pattern (Muster). In den Pattern ist spezifiziert, welche Ausgangsinhalte gegen neue Inhalte ausgetauscht werden. Dabei scannt der XSL-Prozessor die gesamte Struktur eines XML-Dokuments, vergleicht sie mit den Mustern der Template-Regeln, ersetzt Inhalte und gibt anschließend das neu erzeugte Dokument aus.

Beispiel XSL-Stylesheet / Regeln

Das folgende Beispiel gibt einen ersten Eindruck, wie XSL-Dokumente aufgebaut sind. Das Element xsl:template definiert die so genannten Template-Regeln. Jedes Template-Element besitzt ein match-Attribut, das festlegt, welche Inhalte des Ausgangsdokuments durch neue ersetzt werden. Ein Beispiel:

<xsl:template match="/">
<html>
<head>
</head>
<body>
</body>
</html>
</xsl:template>

Verarbeitet der XSL-Prozessor obiges Ausgangsdokument, bei dem der erste Knoten die Root ist, so gibt er das folgende leere HTML-Dokument aus:

<html>
<head>
</head>
<body>
</body>
</html>

Server- oder Client-seitige Verarbeitung

Bei einer XSL-Transformation liest der XSL-Prozessor das XML-Dokument und das XSL-Stylesheet. Aus den im XSL-Stylesheet enthaltenen Anweisungen erzeugt der XSL-Prozessor ein neues XML-Dokument. Diese Dokumente werden vom Parser auf syntaktische Strukturen hin überprüft und nach den Template-Regeln in das neue Format umgewandelt. Im Allgemeinen wird das Parsen von einem entsprechenden Programm (beispielsweise Kays Saxon-Parser) durchgeführt.

Prinzipiell sind drei Szenarien denkbar, an welcher Stelle eine solche Umwandlung erfolgen kann:

Vorrangig Server-seitig

Bis auf weiteres steht voraussichtlich die Server-seitige Verarbeitung im Mittelpunkt. Als zentraler Grund hat sich vor allem der hohe Ressourcenverbrauch bei der Transformation herauskristallisiert. Die Client-seitige Verarbeitung von XSL-Templates und die Umsetzung in das jeweilige Format scheitert zudem an der mangelnden Unterstützung dieser Technik durch aktuelle Browser. Dass der Server relativ einfach die Darstellungsmöglichkeiten eines Clients einlesen und die Informationen entsprechend aufbereiten kann, ist ein weiteres wichtiges Argument für den Server-seitigen Einsatz.

Verteilte Verarbeitung

Bei der rein Server-seitigen Transformation bleiben allerdings die Vorzüge des Client-Server-Modells auf der Strecke. Weitaus sinnvoller erscheint die kombinierte Transformation. Beispielsweise könnte ein Webbrowser eine XSLT-Engine beinhalten und empfangene Daten nach den Benutzervorgaben aufbereiten. In diesem Fall müsste mit dem XML-Dokument auch das Stylesheet übertragen werden, das die Informationenverarbeitung definiert.

Ideal scheint die Kombination aus Client- und Server-seitiger Verarbeitung. Man spricht in diesem Zusammenhang auch von verteilter Stilverarbeitung (distributed style processing). Die Verarbeitung kann dabei Client- oder Server-seitig erfolgen - immer abhängig von der Leistungsfähigkeit des Clients. Im Idealfall einigen sich Client und Server darauf, wer die Transformation übernimmt. Im Ergebnis soll die Leistungsfähigkeit der jeweiligen Seite optimal genutzt werden, um die Serverlast zu minimieren.

XPath

Bei vergleichsweise kleinen XML-basierten Dokumenten ist es noch relativ einfach, eine Transformation vorzunehmen. Man kann sich aber leicht ausmalen, dass es bei umfassenden Dokumenten erheblich schwerer fällt.

Hier hilft XPath, mit der man Teile von XML-Dokumenten adressieren kann. Die "Pfadbeschreibungssprache" erlaubt, Pfade zu bestimmten Informationen zu beschreiben. Gerade auch in Verbindung mit XPointer ist das Ansprechen bestimmter Positionen eine notwendige Voraussetzung, um bestimmte Informationen nutzen zu können. Im Zusammenhang mit XSL benötigt man XPath, um Informationsschnipsel eines XML-Dokuments für die weitere Verarbeitung auszuwählen.

Um die Adressierung von bestimmten Informationen verständlich zu machen, ist ein Blick auf die typische Baumdarstellung hilfreich. Die Adressierung erfolgt bei XPath mittels so genannter Location Paths.

Knotenauswahl mittels Location Paths

Location Paths wählen nach bestimmten Kriterien Knoten aus dem Baum aus, die innerhalb eines vorher definierten Kontextes ausgewertet werden. Folgende Kriterien finden dabei Berücksichtigung:

Ein Location Path ist folgendermaßen aufgebaut: [/]schritt(/schritt)*

Die Verarbeitungsweise funktioniert ähnlich, wie man es von Dateisystemen kennt:

Die Wegbeschreibung zu einer bestimmten Information erfolgt mit folgender Anweisung: achse::typ([prädikat])*

XPath-Werte - Beschreibung

achse gibt dabei das Verhältnis der Knoten zum Kontextknoten an. Nachstehende Übersicht fasst mögliche Werte zusammen.

child: alle direkten Nachkommen eines Knotens, nicht aber Attribute

descendant: alle Nachkommen des Knotens, nicht aber Attribute

descendant-or-self: alle Nachkommen des Knotens, inklusive er selbst, nicht aber dessen Attribute

attribute: alle Attribute (außer Namespaces), die direkte Nachkommen des Knotens sind

namespace: alle Namespace-Attribute, die direkte Nachkommen des Knotens sind

parent: Vater des aktuellen Knotens

ancestor: alle Väter des Knotens

ancestor-or-self: alle Vorfahren des Knotens, inklusive er selbst

following-sibling: folgender Bruder

preceding-sibling: vorhergehender Bruder

following: alle folgenden Knoten, die keine Nachkommen des Knotens sind

preceding: alle vorhergehenden Knoten, die keine Nachkommen des Knotens sind

self: der aktuelle Knoten

XPath-Ausdrücke sehen in der Praxis folgendermaßen aus: Der erste Location Path wählt alle Textelemente aus, die direkte Nachkommen des Kontextknotens sind:

Der zweite Location Path wählt das HTML-Element aus, das ein Kind des Wurzelknotens sein muss.

Stylesheet-Entwicklung

Die Entwicklung von XSL-Stylesheets ist eine grundlegende Verfahrensweise bei der Umwandlung von XML-Dokumenten in andere Formate. Man unterscheidet dabei zwischen explizit und implizit deklarierten Stylesheets, auch wenn in der offiziellen Spezifikation davon nicht die Rede ist.

Bei dem Typus der expliziten Form wird das Stylesheet von bestimmten XML-Elementen eingefasst, die die Stylesheet-Definition enthalten. Bei den einfassenden Elementen muss es sich um eine XSLT-Anweisung mit der Bezeichnung stylesheet oder transform handeln. Außerdem muss der zugehörige Namensraum angegeben werden. Die Kind-Elemente des einfassenden Elements sind Top-Level-Elemente, die globale Konstrukte und verschiedenste Anweisungen einschließen, was mit welchen Daten bei der Transformation geschehen soll.

Eine herausragende Rolle spielen die Template-Regeln (rules). Sie beinhalten die Definition, welches Verhalten bei Übereinstimmungen mit den Quellcode-Konditionen zum Einsatz kommt. Der Inhalt einer solchen Regel bestimmt also den Ausgabebaum des Zieldokuments. Ob die Regeln innerhalb eines Ausgangsdokuments zu finden sind oder ob eine Referenzierung erfolgt, spielt für die eigentliche Transformation keine Rolle.

Bei der einfachsten Form eines impliziten Stylesheets handelt es sich um ein XML-Dokument, das auch gleich das Ausgabedokument enthält.

Aufbau eines Stylesheets

XSL-Stylesheets besitzen einen vorgegebenen Aufbau. Nach der XML-Deklaration (Zeile 1) folgt das so genannte Dokumentenelement mit der XSLT-Namensraumdeklaration (Zeile 2). Dabei ist auch die Angabe der XSLT-Version erforderlich (Zeile2). Es folgen Top-Level-Elemente mit den eigentlichen Template-Regeln (template rules) (Zeile 4). Die Template-Regeln wiederum sind durch XSLT-Instruktionen, Ausgabebaumvorlage (result tree template) und die so genannten literalen Ausgabeelemente (literal result elements) gekennzeichnet. Ein einfaches Beispiel:

1: <?xml version="1.0" ?>
2: <xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/ Transform/1.0">
3:
4: <xsl:template match="fussball">
5: <html>
6: <xsl:apply-templates />
7: </html>
8: </xsl:template>
9: </xsl:stylesheet>

Template-Regeln werden mit dem Elementxsl:template definiert. Sie legen fest, welche Knotentypen des Ausgangsdokuments den Transformationsvorgang durchlaufen. Es folgt die Definition des Musters (Pattern) über match. Match gibt an, auf welche Elemente eine Template-Regel angewendet werden soll. Im Beispiel oben erfolgt über die XSLT-Instruktion xsl:apply-templates die Auswahl von Elementen aus dem Quelldokument. Diese Auswahl kann auch über xsl:for-each erfolgen. Wie es sich für XML-Dokumente gehört, muss das Tag wieder geschlossen werden. Der merkwürdige Begriff "literale Ergebnisdokumente" beschreibt Elemente, die im Ergebnisdokument erzeugt werden.

Allgemein formuliert sieht die Struktur eines Stylesheets wie folgt aus:

<xsl:stylesheet
id = id
extension-element-prefixes = tokens
exclude-results-prefixes = tokens
version = number>
<!-Content: (xsl:import*, top-level-elements) - ->
</xsl:stylesheet>

An Stelle von stylesheet lässt sich auch das Synonym transform verwenden. Im Vergleich zu den Beispielen oben fällt auf, dass zwei Neuerungen enthalten sind: extension-element-prefixes und exclude-results-prefixes. Sie sind für Erweiterungen der XSLT-Funktionalität zuständig.

Weitere Beispiele

Die zwei weiterführenden Beispiele sollen einen Eindruck davon vermitteln, was sich mit XSL in der Praxis bewerkstelligen lässt. Mittels XSL können Sie beispielsweise aus einem XML-Dokument alle mehrfach vorhandenen, inhaltsgleichen Textnodes entfernen. Folgende Anweisung löscht alle Duplikate aus einer Liste:

<xsl:variable name="unique-list"
select="//state[not(.=following::gewuenschtes_tag)]" />
<xsl:for-each select="$unique-list">
<xsl:value-of select="." />
</xsl:for-each>

Kniffliger gestaltet sich die Transformation XML-basierter Dokumente nach HTML - beispielsweise wenn man aus mehreren Elementen eines XML-Dokuments eine HTML-Dropdown-Liste erzeugen möchte.

<produkt> 1</produkt>
<produkt> 2</produkt>
...
<produkt> 10</produkt>

Für die Transformation verwendet man folgende XSL-Funktion:

<select name="ziffer">
<xsl:for-each select="produkt">
<option value="{text()}"><xsl:value-of /></option>
</xsl:for-each>
</select>

Live-Beispiele

Wir stellen Ihnen einige Dateien mit einfachen Beispielen bereit, um die Funktionsweise bei der Umwandlung von XML über XSL in darstellbare Dateien zu zeigen. Allerdings benötigen Sie zur Ansicht einen XML-fähigen Browser. Wir haben den Internet Explorer ab Version 5.x gewählt, da er bisher die weiteste Verbreitung gefunden hat.

Zudem müssen Sie Ihren Browser eventuell auf den neuesten MSXML-Parser upgraden. Sie finden das MSXML Software Developement Kit in der 3.0-Version hier bei Microsoft.

Die unterschiedlichen Beispiele können Sie leicht über eine in XML geschriebene Startdatei aufrufen. Bitte klicken Sie hier, um die Beispiele anzuzeigen.

Die folgende Tabelle stellt Ihnen die jeweiligen Dateien im Textformat bereit, so dass Sie die jeweiligen Verarbeitungsprozesse nachvollziehen können - auf dem Server liegen diese Dateien im XML-, XSL- oder DTD-Format vor.

Beispieldateien im Textformat

XML

XSL

DTD

Ausgabe

Startdatei

Index

-

Startdatei, Verlinkung mit anderen Dateien, Anzeige einer Grafik.

Beispiel1

Beispiel1

-

Texte mit Überschriftformatierung in H1 und H2.

Beispiel2

Beispiel2

-

Texte mit Überschriftformatierung in H1 und H2 (obiges Beispiel modifiziert).

Beispiel3

Beispiel3

Beispiel3

Farblich formatierter Text, sortiert.

Beispiel4

Beispiel4

-

Text in Tabelle.

Kommende Formatierungsmöglichkeiten

Mit Hilfe von XSL lassen sich XML-basierte Inhalte schon heute für typische Plattformen, insbesondere für das Web, transformieren. Darüber hinaus bietet sich die Formatierung über Cascading Style Sheets an. CSS ermöglicht allerdings meist nur ein Eins-zu-Eins-Mapping von XML-Dokumenten. Da CSS selbst keine Transformationen kennt, folgt das resultierende Layout stark der XML-Dokumentenstruktur. CSS eignet sich nicht für das Erzeugen von unterschiedlichen Darstellungsformen. Anders verhält es sich bei der Veröffentlichung im Web. Hier kann man HTML und CSS als relativ stabil bewerten, so dass der Einsatz durchaus Sinn macht. Zudem sind Webdesigner mit diesen Techniken vertraut.

Sollen jedoch XML-basierte Daten insbesondere für Printmedien formatiert werden, sind HTML und CSS nicht verwendbar. Die so genannten Formatierungsobjekte (FO) sollen diesen Anforderungen gerecht werden. Die Implementierung von XSL-FO-fähigen Applikationen steckt jedoch noch in den Kinderschuhen.

Formatierungsobjekte (FO)

Die XSL-Spezifikation führt verschiedene Formatierungsmodelle ein, die die logische Platzierung von Formatierungsobjekten auf einer Präsentationsfläche beschreiben. Bei diesen Objekten handelt es sich um Zeichen, Linien, Rechtecke, zusammengesetzte Formen etc. Um Formatierungsobjekte auf der Präsentationsfläche exakt platzieren zu können, verwendet man ein Koordinatensystem (ähnlich wie man es unter CSS kennt).

Ein zentraler Begriff ist in diesem Zusammenhang das Bereichsmodell (area model). Mit seiner Hilfe lassen sich Bereiche auf einer Präsentationsfläche in aufeinander folgende oder hierarchisch verschachtelte Bereiche definieren. Diesen Bereichen kann man Attribute wie Ränder, Farben oder auch Inhalte zuweisen. Ebenso ist die Formatierung von Tabellen und Listen möglich. Fast noch bemerkenswerter: Auch die akustische Ausgabe ist vorgesehen. In Zukunft könnte man sich dann die News aus dem Netz von einem geeigneten Client vorlesen lassen. Wenn das keine guten Aussichten sind?

Fazit

Die eXtensible Style Language zeigt sich zweifelsohne als herausragende Technologie. Sie wird dafür sorgen, dass die Vorzüge von XML in der Praxis zum Tragen kommen, und dabei die Aufbereitung von Inhalten für unterschiedlichste Plattformen gewährleisten.

Bis auf weiteres kommt XSL überwiegend auf Serverseite zur Transformation von XML- nach HTML-Dokumenten zum Einsatz. Bis XSL jedoch auch für die Formatierung von anderen Ausgabedokumenten umfangreich eingesetzt wird, dürfte noch einige Zeit vergehen. (sda)

Weitere Informationen

Wer sich detaillierter mit XSL auseinander setzen will, findet im Internet reichlich Lesestoff. Die Zahl der lohnenden XSL(T)-Sites ist inzwischen recht beachtlich. Leider ist bislang keine ergiebige deutschsprachige Site dabei.

Informationsquellen

Website

Inhalt

XSL Homepage des W3C

Originalspezifikationen, News und Links zu Artikeln und XSL-Software.

XSL-Rubrik der XML Cover Pages

Sehr aktuelle Zusammenstellung von Links zu allen relevanten Informationsquellen im Netz.

XSLinfo

Link-Sammlung inklusive News und Software-spezifischen Informationen.

XSL Tutorial

Folien eines Vortrags von Paul Grosso und Norman Walsh.

XSL Tutorial

Leicht verständliche Tutorials zu fast allen Bereichen, die mit XSL zu tun haben.

Practical Transformation Using XSLT and XPath

137-seitiger Auszug aus den Schulungsmaterialien von Crane Softwrights, steht zum Download bereit.

XSL Frequently Asked Questions

Die wichtigste Anlaufstelle für Praktiker. Gepflegte Sammlung von Fragen und Antworten aus der Mulberry-Mailingliste.

ZVON XSL Tutorial

Sehr ausführliche XSL-Dokumentation von Miloslav Nic. Steht auch zum Download zur Verfügung.

XSL-List

Mailingliste zu XSL, in der auch Michael Kay sehr aktiv ist.

Jeni's XSLT Pages

XSLT-Site mit unzähligen Tutorials und Beispielen.

Unofficial MSXML XSLT FAQ

Fragen und Antworten zu MSXML.