Optionen und weiterführende Links



In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen...

Von XML nach XML

Von XML nach XML

Die Möglichkeiten, XML mit CSS zu formatieren, sind recht eng begrenzt. Daher gibt es eine eigene XML-Stylesheet-Sprache namens XSL (Extensible Style Language). XSL besteht aus zwei wichtigen Teilen

  • mit XSL-FO (XSL Formatting Objects) könnt Ihr XML-Daten formatieren
  • mit XSLT (XSL Transformation) könnt Ihr XML-Daten in andere XML-Daten (beispielsweise ein XHTML-Dokument) transformieren.

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.

XSLT ist selbst eine XML-Sprache, XSLT-Dateien sind also selbst XML-Dokumente. Das Wurzelelement ist 'stylesheet' (oder synonym 'transform'). Alle XSLT-Elemente liegen im Namensraum 'http://www.w3.org/1999/XSL/Transform', der normalerweise mit dem Präfix 'xsl' verbunden wird. Außerdem muß das Wurzelelement das Attribut 'version' mit dem Wert '1.0' besitzen

<?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.

Innerhalb des 'xsl:stylesheet'-Elements definiert Ihr sogenannte Templates. Ein solches Template ist ein 'xsl:template'-Element, das ein Attribut 'match' enthält. Diesem Attribut 'match' wird ein Elementname aus dem zu transformierenden XML-Dokument zugewiesen. Jedesmal, wenn der Parser auf ein entsprechendes Element stößt, ersetzt er es durch das Template

...
<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

  • Ausgabelemente sortieren oder nummerieren
  • Schleifen und bedingte Verarbeitung (if-Verzweigungen)
  • Importieren anderer Stylesheets

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).

Zum Abschluß noch ein paar Worte zu XSL-FO (XSL Formatting Objects, siehe oben). XSL-FO ist wie XSLT eine eigene XML-Sprache, mit der Ihr das exakte Erscheinungsbild Eurer Daten beschreiben könnt. Es gibt Elemente zur Beschreibung von Seiten, Textblöcken, Grafiken, horizontalen Linien, ... Üblicherweise wird (wie oben erklärt) ein XSLT-Stylesheet benutzt, um Euer XML-Dokument in ein XSL-FO-Dokument umzuformen. Da die modernen Browser XSL-FO (noch) nicht direkt verwerten können, wird meist mit einem weiteren Prozessor aus dem XSL-FO-Dokument ein PDF-, TeX-, oder anderes Dokument erzeugt. Aus diesem Grund (und weil XSL-FO ziemlich komplex ist), werde ich hier nicht näher darauf eingehen.



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


?>