In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen... |
Von XML nach XML | |
Von XML nach XML
In der Praxis wird meist die Transformations-Komponente XSLT und weniger die Formatierungs-Komponente XSL-FO verwendet. Darum werden wir uns auch hier weitgehend auf XSLT beschränken. Eingebunden wird ein XSL-Stylesheet sehr ähnlich wie bei einem CSS-Stylesheet <?xml-stylesheet href="comics-styles.xsl" type="text/xsl"?>
Irgendwer muß natürlich die XSL-Transformation durchführen. Dazu dient ein eigener
XSLT-Parser. Die meisten modernen Browser verfügen über einen
solchen XSLT-Parser (Internet Explorer ab 6.0, Netscape ab 6.1 / Mozilla M14). Der Internet Explorer 5.x
hat zwar einen XSLT-Parser, verwendet jedoch noch eine veraltete Namespace-URL
('http://www.w3.org/TR/WD-xsl'). Opera kann bis dato nicht mit XSLT umgehen. Die Transformation
kann auch vom Server erledigt werden. Dazu gibt es XSLT-Parser als Zusatzmodule zum Webserver,
beispielsweise Xalan für Apache.
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet>
Dieses «Minimal-Stylesheet» ist sogar schon funktionsfähig, tut aber (natürlich)
nichts.
... <xsl:template match="comic"> <p>Und noch ein Comic</p> </xsl:template> ... In diesem Beispiel wird für jedes vorkommende comic-Element in das Ausgabe-Dokument geschrieben <p>Und noch ein Comic</p> In dem Template kann beliebiger Code stehen, solange das Stylesheet wohlgeformt bleibt (also auch beispielsweise JavaScript-Code). Das match-Attribut kann nicht nur einen einfachen Elementnamen, sondern auch einen sogenannten XPath aufnehmen. XPath ist eine Syntax zur Beschreibung bestimmter Knoten oder Gruppen von Knoten in einem XML-Dokument. In unserem Fall geben wir mit XPath einfach den Pfad durch den Elementbaum zu dem Element an, auf das unser Template angewendet werden soll (getrennt durch /). Als Demonstrationsbeispiel nehmen wir wieder das bereits von CSS bekannte Dokument <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <?xml-stylesheet href="comics-styles.xsl" type="text/xsl"?> <comics> <book> <title>Die Beispiel-Serie</title> <author>A. U. Tor</author> </book> <book> <title>Noch eine Serie</title> <author>Blei&Stift</author> </book> </comics> Zunächst lassen wir uns im Template für das Wurzelelement 'comics' das HTML-Gerüst schreiben <xsl:template match="comics"> <html> <head></head> <body> <p style="font-size:125%;color:darkblue;text-align:center"> Meine Comic-Sammlung </p> <hr /> <p style="font-size:80%;font-weight:bold">Ende der Liste</p> </body> </html> </xsl:template> Außerdem brauchen wir noch ein Template für die einzelnen book-Elemente. Dabei wollt Ihr aber nicht nur konstanten Text in Euer Ausgabe-Dokument schreiben, sondern auch den Inhalt Eures Eingabe-Dokuments. Dazu gibt es das XSLT-Element xsl:value-of. Damit fügt Ihr den sogenannten String-Wert eines Kindselements des Elements, das vom aktuellen Template behandelt wird, in das Ausgabe-Dokument ein. Der String-Wert ist einfach der Text des Elements ohne Tags (also ohne alles, was zwischen < und > steht). Das gewünschte Element steht im select-Attribut <xsl:template match="book"> <p style="border-style:solid; border-width:thin; padding:5px"> <b><xsl:value-of select="title" /></b><br /> von <xsl:value-of select="author" /> </p> </xsl:template> Jetzt müssen wir das Template für die book-Elemente noch im Template für die comics-Elemente an der richtigen Stelle aufrufen. Dazu dient das Element xsl:apply-templates. Das comics-Template sieht dann also so aus (Ausschnitt) <body> <p style="font-size:125%;color:darkblue;text-align:center"> Meine Comic-Sammlung </p> <xsl:apply-templates select="book" /> <hr /> <p style="font-size:80%;font-weight:bold">Ende der Liste</p> </body> Ihr könnt für dasselbe Element auch verschiedene Templates definieren. Dazu könnt Ihr xsl:template und xsl:apply-templates ein mode-Attribut mitgeben. In unserem Beispiel ergänzen wir ein Inhaltsverzeichnis mit einem zusätzlichen Template für die book-Elemente. Unser Stylesheet sieht dann insgesamt so aus <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="comics"> <html> <head></head> <body> <p style="font-size:125%;color:darkblue;text-align:center"> Meine Comic-Sammlung </p> <p style="font-weight:bold">Inhaltsverzeichnis</p> <ul> <xsl:apply-templates select="book" mode="inhalt" /> </ul> <p style="font-weight:bold">Detailliste</p> <xsl:apply-templates select="book" /> <hr /> <p style="font-size:80%;font-weight:bold">Ende der Liste</p> </body> </html> </xsl:template> <xsl:template match="book"> <p style="border-style:solid; border-width:thin; padding:5px"> <b><xsl:value-of select="title" /></b><br /> von <xsl:value-of select="author" /> </p> </xsl:template> <xsl:template match="book" mode="inhalt"> <li> <xsl:value-of select="title" /> </li> </xsl:template> </xsl:stylesheet> Damit sind die Fähigkeiten von XSLT nur angerissen. Im Namensraum 'xsl' sind mehr als 30 Elemente definiert, mit denen ihr vieles verwirklichen könnt
und vieles mehr. Es ist sehr wahrscheinlich (wenn auch noch nicht formal bewiesen), daß Ihr
XSLT für beliebige Transformationen einsetzen könnt (für die Fachleute unter Euch:
XSLT ist Turing-vollständig).
|
Special vom: | 16.01.2003 |
Autor dieses Specials: | Henning Kockerbeck |
Die weiteren Unterseiten dieses Specials: | |
Die reine Lehre - HTML | |
Stilvoll - CSS | |
Kleiner Grundkurs Programmieren | |
Jetzt wird's dynamisch - JavaScript | |
Die andere Seite der Dynamik - PHP | |
Neue Gefilde - XML | |
Weiterführende Links | |
Zurück zur Hauptseite des Specials |