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:
XPath (XML Path Language) dient dazu, bestimmte Dokumententeile eines XML-Dokuments anzusprechen.
XSLT (XML Style Language Transformation) beschreibt, wie man die Baumdarstellung eines XML-Dokuments in eine andere Baumdarstellung verwandelt.
XSL (eXtensible Style Language) verfügt neben XSLT über einen Satz Formatierungsobjekte samt zugehöriger Eigenschaften.
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:
Client-seitig: Ein XML-Dokument wird mit dem verknüpften Stylesheet an einen Webbrowser übergeben. Dieser wandelt das Dokument nach den in der Vorlage definierten Anweisungen um und stellt es lokal dar.
Server-seitig: In diesem Fall weist der Server einem XML-Dokument ein Stylesheet zu und übermittelt das transformierte Dokument an den Client. Meist handelt es sich um HTML-Dokumente.
Drittprogramm: Ein Programm (das beispielsweise von einem Application-Server gesteuert wird) transformiert XML-Dokumente unabhängig von Client und Server, bevor sie auf dem Server veröffentlicht werden. Auch hier sind verschiedene Zielformate wie etwa HTML denkbar. Client und Server bekommen dabei nur das transformierte Dokument zu Gesicht.
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:
Kontext- oder Ausgangsknoten
Kontextgröße, die angibt, aus welchen Knoten ausgewählt werden soll (beispielsweise die Anzahl der Knoten im Dokument)
Kontextposition, die die Position des Kontextknotens angibt
definierte Variablen
Funktionen
gültige Namensräume
Ein Location Path ist folgendermaßen aufgebaut: [/]schritt(/schritt)*
Die Verarbeitungsweise funktioniert ähnlich, wie man es von Dateisystemen kennt:
Ein Pfad wird von links nach rechts abgearbeitet.
Pfade werden durch einen Schrägstrich ("/") voneinander getrennt.
Beginnt der Pfad mit einem Schrägstrich, so handelt es sich um einen absoluten Pfad.
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:
text()
child::text()
Der zweite Location Path wählt das HTML-Element aus, das ein Kind des Wurzelknotens sein muss.
/html
/child::html
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.
XML | XSL | DTD | Ausgabe | |
---|---|---|---|---|
| ||||
| - | Startdatei, Verlinkung mit anderen Dateien, Anzeige einer Grafik. | ||
- | Texte mit Überschriftformatierung in H1 und H2. | |||
- | Texte mit Überschriftformatierung in H1 und H2 (obiges Beispiel modifiziert). | |||
Farblich formatierter Text, sortiert. | ||||
- | 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.
Website | Inhalt | |
---|---|---|
| ||
| Originalspezifikationen, News und Links zu Artikeln und XSL-Software. | |
Sehr aktuelle Zusammenstellung von Links zu allen relevanten Informationsquellen im Netz. | ||
Link-Sammlung inklusive News und Software-spezifischen Informationen. | ||
Folien eines Vortrags von Paul Grosso und Norman Walsh. | ||
Leicht verständliche Tutorials zu fast allen Bereichen, die mit XSL zu tun haben. | ||
137-seitiger Auszug aus den Schulungsmaterialien von Crane Softwrights, steht zum Download bereit. | ||
Die wichtigste Anlaufstelle für Praktiker. Gepflegte Sammlung von Fragen und Antworten aus der Mulberry-Mailingliste. | ||
Sehr ausführliche XSL-Dokumentation von Miloslav Nic. Steht auch zum Download zur Verfügung. | ||
Mailingliste zu XSL, in der auch Michael Kay sehr aktiv ist. | ||
XSLT-Site mit unzähligen Tutorials und Beispielen. | ||
Fragen und Antworten zu MSXML. |