Definieren von Stylesheets

(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)

Wenn Sie mit der Spezifikation der Cascading Style Sheets (CSS) vertraut sind, die im Web oft benutzt werden, wissen Sie vermutlich, daß CSS-Stylesheets in einer separaten Datei gespeichert oder als spezielles Element in einem HTML-Dokument eingebettet werden können. Außerdem können individuelle Attribute im Dokument mit bestimmten Styling-Informationen versehen werden. In diesem Abschnitt untersuchen wir die entsprechenden Ansätze in XSLT.

Zu allen drei Arten, CSS zu benutzen, gibt es eine analoge Technik in XSLT, wenngleich die XSLT-Stylesheets wesentlich mächtiger sind. Obwohl diese Erläuterung auf einige spezielle XSLT-Elemente eingeht und einige davon in den Beispielen gezeigt werden, wird nicht erwartet, daß Sie irgend etwas darüber wissen. Diese Elemente werden später in diesem Abschnitt detaillierter beschrieben. Dieser Abschnitt führt Sie lediglich in die verschiedenen Arten ein, wie Stylesheets geschrieben werden können, und zeigt, wie das mit den bearbeiteten Dokumenten zusammenhängt.

Vereinfachte Stylesheets

Vereinfachte Stylesheets entsprechen mehr der Verwendung des style-Attributs in HTML-Dokumenten als irgend etwas sonst, aber die Ähnlichkeit ist minimal. Dieser Ansatz ist weniger mächtig als die Verwendung von eingebetteten oder eigenständigen Stylesheets; das Element xsl:stylesheet ist nicht erlaubt, da das gesamte Stylesheet als Rumpf eines xsl:template-Elements interpretiert wird. Bei vielen Eigenschaften von XSLT müssen zusätzliche »Top-level«-Elemente benutzt werden (Geschwister des xsl:template-Elements), so daß sie in diesem Zusammenhang nicht erlaubt sind. Diese Art von Stylesheet ist schwieriger zu benutzen, wenn die Grundstruktur des Ausgangsdokuments erhalten bleiben muß, kann jedoch perfekt Abfragen über die Struktur und den Inhalt des Ausgangsdokuments vornehmen. Vereinfachte Stylesheets werden dann am häufigsten eingesetzt, wenn die Ausgabedokumente sehr regulär sind und nur auf sehr spezielle Teile des Ursprungsdokuments zugreifen müssen.

Da zu Beginn, wenn man XSLT noch lernt, vereinfachte Stylesheets am einfachsten sind, sehen wir uns einmal eines an. In Abfragen von XML mit XPath verwendeten wir eine Liste von Raumschiffen aus einer Reihe von bekannten Fernsehserien für die Eingabedaten (siehe Beispiel ships.xml); diese Eingabe benutzen wir hier wieder. Statt mit DOM und XPath eine Knotenliste zu bekommen, benutzen wir XSLT, um eine Liste von Raumschiffen zu bekommen, die nach ihren Registrierungsnummern sortiert und hübsch als HTML-Tabelle dargestellt werden sollen. Das folgende Beispiel zeigt das entsprechende Stylesheet. Beachten Sie, daß das Wurzelelement des Stylesheet-Dokuments den Namensraum für XSLT deklariert und die verwendete XSLT-Version angibt; diese Angaben werden bei der Verwendung von vereinfachten Stylesheets benötigt.

Beispiel: ships-template.html

<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0">
  <head>
    <title>Schiffe der <xsl:value-of select="/shiptypes/@name" /></title>
  </head>
  <body>
    <table border="1">
      <tr>
        <th>Schiff</th>
        <th>Klasse</th>
        <th>Registrierung</th>
        <th>Captain</th>
      </tr>
      <xsl:for-each select="/shiptypes/ship">
        <xsl:sort select="registry-code" />
        <tr>
          <td><xsl:value-of select="@name" /></td>
          <td><xsl:value-of select="class" /></td>
          <td><xsl:value-of select="registry-code" /></td>
          <td><xsl:value-of select="captain" /></td>
        </tr>
      </xsl:for-each>
    </table>
  </body>
</html>

Als Ergebnis der Bearbeitung der Datei ships.xml aus dem Beispiel ships.xml mit dem Stylesheet ships-template.html aus dem Beispiel ships-template.html erhält man die Datei ships.html, die in nächsten Beispiel gezeigt wird. Die Transformation wurde mit 4XSLT durchgeführt.

Beispiel: ships.html

<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
      <title>Schiffe der United Federation of Planets</title>
  </head>
  <body>
    <table border="1">
      <tr>
        <th>Schiff</th>
        <th>Klasse</th>
        <th>Registrierung</th>
        <th>Captain</th>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Constitution</td>
        <td>NCC-1701</td>
        <td>James T. Kirk</td>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Galaxy</td>
        <td>NCC-1701-D</td>
        <td>Jean-Luc Picard</td>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Sovereign</td>
        <td>NCC-1701-E</td>
        <td>Jean-Luc Picard</td>
      </tr>
      <tr>
        <td>USS Voyager</td>
        <td>Intrepid</td>
        <td>NCC-74656</td>
        <td>Kathryn Janeway</td>
      </tr>
      <tr>
        <td>USS Sao Paulo</td>
        <td>Defiant</td>
        <td>NCC-75633</td>
        <td>Benjamin L. Sisko</td>
      </tr>
    </table>
  </body>
</html>

Beachten Sie, daß die Transformation ein meta-Element zu Beginn des generierten HTMLs hinzugefügt hat und daß die Einrückung und der Leerraum innerhalb dessen, was für das Element xsl:for-each eingefügt wurde, ein wenig angepaßt wurde. Die folgende Abbildung zeigt, wie das HTML-Ergebnisdokument in einem Webbrowser aussieht.

ships.html in einem Browser

Abbildung: ships.html in einem Browser

Eigenständige Stylesheets

In separaten Dateien abgespeicherte Stylesheets sind vermutlich die am häufigsten benutzte Form von Stylesheets sowohl für CSS wie auch für XSLT. Das Wurzelelement des Stylesheets muß ein xsl:stylesheet- oder xsl:transform-Element sein. Das benutzen wir auch in den meisten Beispielen dieses Buches. Eigenständige Stylesheets sind mächtiger und flexibler als vereinfachte Stylesheets und eignen sich besser zur Modularisierung, mit der man einen mächtigen Import-Mechanismus ebenso wie umfangreiche Möglichkeiten beim Mustervergleich hat.

Betrachten wir das vorherige Beispiel nun mit einem eigenständigen Stylesheet. Wir könnten eine einfache Hülle um das Vorlagendokument (Template-Dokument) benutzen, um ein technisch korrektes Stylesheet zu erstellen, aber wir gehen weiter und verändern es so, daß es mehr der üblichen Art entspricht, wie ein Stylesheet strukturiert wird. Diese spezielle Version sortiert die Schiffstabelle nicht mehr, sondern behält deren Reihenfolge aus dem Originaldokument bei. Ein Stylesheet wird häufig auf diese Art in einer dokumentorientierten Anwendung strukturiert. Unser neues Stylesheet wird im folgenden Beispiel gezeigt. Beachten Sie, daß der XSLT-Namensraum hier ebenfalls deklariert ist, zusammen mit dem version-Attribut, aber wir müssen das Namensraumpräfix nicht angeben, wenn das Attribut an ein existierendes xsl:stylesheet-Element angefügt wird.

Beispiel: ships.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <html>
      <head>
        <title>Schiffe der <xsl:apply-templates mode="head" /></title>
      </head>
      <body>
        <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>  
  <xsl:template match="shiptypes" mode="head">
    <xsl:value-of select="@name" />
  </xsl:template>  
  <xsl:template match="shiptypes">
    <table border="1">
      <tr>
        <th>Schiff</th>
        <th>Klasse</th>
        <th>Registrierung</th>
        <th>Captain</th>
      </tr>
      <xsl:apply-templates />
    </table>
  </xsl:template>  
  <xsl:template match="ship">
    <tr><td><xsl:value-of select="@name" /></td>
      <td><xsl:value-of select="class" /></td>
      <td><xsl:value-of select="registry-code" /></td>
      <td><xsl:value-of select="captain" /></td>
    </tr>
  </xsl:template>  
</xsl:stylesheet>

Diese Version ist als eine Menge von Vorlagen strukturiert, die speziellen Konstrukten im Eingabedokument entsprechen, wobei die passenden Konstrukte vom match-Attribut des xsl:template-Elements angegeben werden. Die XSLT-Konstrukte in diesem Stylesheet werden später in diesem Abschnitt detailliert erklärt. Das folgende Beispiel zeigt das Ergebnis der Transformation von ships.xml (siehe Beispiel ships.xml) mit ships.xsl (siehe das vorherige Beispiel).

Beispiel: ships2.html

<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
      <title>Schiffe der United Federation of Planets</title>
  </head>
  <body>
    <table border="1">
      <tr>
        <th>Schiff</th>
        <th>Klasse</th>
        <th>Registrierung</th>
        <th>Captain</th>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Sovereign</td>
        <td>NCC-1701-E</td>
        <td>Jean-Luc Picard</td>
      </tr>
      <tr>
        <td>USS Voyager</td>
        <td>Intrepid</td>
        <td>NCC-74656</td>
        <td>Kathryn Janeway</td>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Galaxy</td>
        <td>NCC-1701-D</td>
        <td>Jean-Luc Picard</td>
      </tr>
      <tr>
        <td>USS Enterprise</td>
        <td>Constitution</td>
        <td>NCC-1701</td>
        <td>James T. Kirk</td>
      </tr>
      <tr>
        <td>USS Sao Paulo</td>
        <td>Defiant</td>
        <td>NCC-75633</td>
        <td>Benjamin L. Sisko</td>
      </tr>
    </table>
  </body>
</html>

Der einzige Unterschied zwischen dieser Ausgabe und der in Beispiel ships.html ist, daß die Tabelle in dieser Version nicht sortiert ist.

Eingebettete Stylesheets

XSLT-Stylesheets können auf ganz ähnliche Weise in anderen Dokumenten eingebettet werden, wie CSS-Stylesheets in einem HTML-Dokument eingebettet werden können. XSLT-Stylesheets werden üblicherweise in dem Dokument eingebettet, in dem sie angewendet werden. Das eingebettete Element muß das xsl:stylesheet-Element (oder xsl:transform-Element) sein. Diese Art der Verwendung ist nicht sehr häufig, da man dabei das Stylesheet nicht ebenso einfach in anderen Dokumenten benutzen kann und wenige XSLT-Prozessoren eingebettete Stylesheets unterstützen. Wegen dieses Mangels an breiter Werkzeugunterstützung für eingebette Stylesheets zeigen wir dazu keine Beispiele.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Python & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2002 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Python & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de