Mehrere Stylesheets kombinieren

(Auszug aus "Java und XSLT" von Eric M. Burke)

Wir haben gesehen, wie man mit Template-Parametern, Named-Templates und Template-Modi wiederverwendbare Codefragmente schreibt, die anfangen, Funktionsaufrufen zu ähneln. Durch Kombination mehrerer Stylesheets kann man anfangen, Bibliotheken von wiederverwendbaren XSLT-Templates zu entwickeln, womit man die Produktivität dramatisch steigern kann.

Produktivitätszuwächse treten auf, weil Programmierer nicht immer wieder denselben Code für jedes Stylesheet schreiben müssen. Wiederverwendbarer Code wird in einem einzelnen Stylesheet plaziert und in andere Stylesheets importiert oder eingebunden. Ein weiterer Vorteil dieser Technik ist ihre Wartbarkeit. Die XSLT-Syntax kann häßlich werden, und die Codemodularisierung in kleine Fragmente kann die Lesbarkeit stark verbessern. Wir haben beispielsweise verschiedene Beispiele zur Liste der Bundespräsidenten gesehen. Da wir fast immer den Namen eines Bundespräsidenten anzeigen wollen, sollten die Name-Templates in ein separates Stylesheet übertragen werden. Das folgende Beispiel zeigt ein Stylesheet zur Verwendung durch andere Stylesheets.

Beispiel: NamensFormatierung.xslt

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html"/>
   <!-- ** Zeige einen Namen, der etwa so formatiert ist: "Burke, Eric Matthew" -->
   <xsl:template match="name" mode="NachVorMittelname">
      <xsl:value-of select="nachname"/>
      <xsl:text>, </xsl:text>
      <xsl:value-of select="vorname"/>
      <xsl:for-each select="mittelname">
         <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
         <xsl:value-of select="."/>
      </xsl:for-each>
   </xsl:template>
   <!-- ** Zeige einen Namen, der etwa so formatiert ist: "Eric Matthew Burke" -->
   <xsl:template match="name" mode="VorMittelNachname">
      <xsl:value-of select="vorname"/>
      <xsl:for-each select="mittelname">
         <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
         <xsl:value-of select="."/>
      </xsl:for-each>
      <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
      <xsl:value-of select="nachname"/>
   </xsl:template>
</xsl:stylesheet>

Der Code im Beispiel NamensFormatierung.xslt verwendet Template-Modi, um zu ermitteln, welches Template instantiiert wird. Zusätzliche Stylesheets können leicht hinzugefügt werden, und diese Änderungen wären jedem Stylesheet zugänglich, das dieses hier importiert oder einbindet. Da dieses Stylesheet ausgelegt wurde, um von anderen Stylesheets eingesetzt zu werden, beinhaltet es kein Template für den Wurzelknoten.

Für große Websites ist die Fähigkeit, Stylesheets einzubinden oder zu importieren, von immenser Bedeutung. Jedes Dokument in der Site wird die gleiche Navigationsleiste, dieselbe Fußzeile und vielleicht einen gemeinsamen Kopfbereich haben. Eigenständige Stylesheet-Fragmente, die von anderen Stylesheets eingebunden werden, sollten diese wiederverwendbaren Elemente generieren. So wird beispielsweise der Urheberrechtsvermerk einmal in der Fußzeile plaziert, und Änderungen spiegeln sich sofort auf der gesamten Website wider, ohne daß Änderungen in der Programmierung vorgenommen werden müssen.

<xsl:include>

Mit dem <xsl:include>-Element kann ein Stylesheet ein anderes einbinden. Das Element darf nur als Top-Level-Element eingesetzt werden, so daß <xsl:include>-Elemente in der Struktur des Stylesheets Schwesternelemente von <xsl:template> sind. Die Syntax von <xsl:include> lautet:

<xsl:include href="uri-referenz"/>

Wenn ein Stylesheet ein anderes einbindet, wird das eingebundene Stylesheet tatsächlich an der Stelle eingefügt, an der das <xsl:include>-Element steht. Genauer werden alle Kindelemente seines <xsl:stylesheet>-Elements in das Dokument eingefügt, in dem <xsl:include> steht. Es ist möglich, viele andere Stylesheets einzubinden, die wiederum andere einbinden können.

Das Einbinden ist ein relativ einfacher Mechanismus, da das resultierende Stylesheet sich exakt so verhält, als hätten Sie alle eingebundenen Elemente in das einbindende Stylesheet eingetippt. Das kann zu Problemen führen, wenn zwei überschneidende Template-Regeln eingebunden werden, daher müssen Sie vorsichtig sein und im voraus planen, um Konflikte zu vermeiden. Wenn ein Konflikt auftritt, ist der XSLT-Prozessor angehalten, einen Fehler zu melden und die Verarbeitung zu stoppen.

<xsl:import>

Das Importieren (im Gegensatz zum Einbinden) eines Stylesheets gibt dem Prozeß ein wenig mehr Intelligenz. Wenn Konflikte auftreten, hat das importierende Stylesheet Vorrang gegenüber den importierten Stylesheets. Anders als bei <xsl:include> müssen <xsl:import>-Elemente, wie hier gezeigt, vor jeglichen Kindelementen von <xsl:stylesheet> auftauchen:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <!-- xsl:import muß vor anderen Top-Level-Elementen auftauchen -->
   <xsl:import href="seitenElemente.xslt"/>
   <xsl:import href="globaleKonstanten.xslt"/>
   <xsl:output method="html"/>
   <xsl:template match="/">
      <html>
         ...
      </html>
   </xsl:template>
   <!-- xsl:include kann irgendwo auftauchen, solange es ein Top-Level-Element bleibt -->
   <xsl:include href="namensFormatierung.xslt"/>
</xsl:stylesheet>

Um den Anforderungen der meisten Websites Rechnung zu tragen, geht man meist so vor, daß in jeder Seite gängige Stylesheet-Fragmente, wie Templates, die Seitenkopfzeilen erzeugen, oder andere wiederverwendbare Elemente importiert oder eingebunden werden. Wenn ein Stylesheet einmal eingebunden oder importiert ist, können seine Templates genutzt werden, als wären sie unmittelbarer Bestandteil des aktuellen Stylesheets.

Hauptsächlich nutzt man <xsl:import> statt <xsl:include>, um Konflikte zu vermeiden. Wenn Ihr Stylesheet nämlich bereits ein Template hat, das auf seitenKopfzeilen paßt, können Sie seitenElemente.xslt nicht mehr einbinden, wenn dort auch ein solches Template existiert. Hier können Sie <xsl:import> nutzen. In diesem Fall hat Ihr eigenes Template seitenKopfzeilen Priorität gegenüber den importierten seitenKopfzeilen.

Hinweis:
Wenn Sie alle <xsl:import>-Elemente in <xsl:include> umwandeln, können Sie Namenskonflikte aufdecken, von denen Sie bis dahin nichts wußten.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Java & XSLT 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 "Java und XSLT" 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