next up previous contents
Nächste Seite: 4 XSL-FO Aufwärts: 3 XSLT Vorherige Seite: 3.5 Funktionen   Inhalt


3.6 Erweiterungsfunktionen

Viele Funktionalitäten, die sich im Gebrauch von XSLT als notwendig erweisen, sind noch nicht in der ersten Version der Spezifikation enthalten. Um derartigen Problemen und damit Unzulänglichkeiten in der Benutzung vorzubeugen, ist das Schreiben von Erweiterungsfunktionen im Standard vorgesehen. Hiermit erhält der Benutzer die Möglichkeit, eigene, problemspezifische Funktionen in einer beliebigen Programmiersprache zu implementieren und in das Stylesheet einzubinden. Diese angedachte Flexibilität geht leider in der ersten Version von XSLT auf Kosten der Abhängigkeit vom XSLT-Prozessor (siehe Kapitel 3.5). So ist in der Spezifikation der Einsatz und die Benutzung von Erweiterungsfunktionen nicht eindeutig definiert. Verschiedene XSLT-Prozessoren arbeiten somit unterschiedlich und benötigen eigens auf sie abgestimmte Angaben, um Erweiterungen ausführen zu können. Neben den bereits in Kapitel 3.5 erläuterten Funktionen element-available() und function-available() existiert noch eine weitere Möglichkeit die Funktionalität des Stylesheets zu garantieren. Das ist mittels des fallback-Elementes möglich, indem direkt beim ersten Auftauchen eines nicht erreichbaren Elementes oder einer nicht erreichbaren Funktion in den durch fallback definierten Verarbeitungsfall gesprungen wird. Damit wird auf jeden Fall die Ausführung der innerhalb des fallback-Elementes stehenden Anweisungen garantiert.

Beispiel 3.6.1:
Einsatz eines Erweiterungselementes:
Zur Ausgabe des Ergebnisses einer XSL-Transformation in mehrere Dokumente liefert Xalan eine entsprechende Erweiterung. Der Namensraum und sein Präfix redirect wird wie üblich angegeben. Allgemein ist dieser für den XSLT-Prozessor unwichtig, doch Xalan benutzt diesen Namensraum bei Erweiterungen zum Auffinden der Klasse, in der die Erweiterungen implementiert sind. Mittels des extension-element-prefixes-Attributes wird dem Prozessor mitgeteilt, mit welchem Präfix Erweiterungselemente versehen sind. Es soll eine HTML-Ausgabe erzeugt werden. Um festzustellen, ob der Prozessor das redirect:write-Element kennt, wird die element-available-Funktion eingesetzt. Ist dies der Fall, so kann das Dokument auf mehrere Dateien aufgeteilt werden. Dafür werden für alle vorhandenen Elemente die Vorlagen mit dem Mode viele aufgerufen. In dieser Vorlage wird die Ausgabe jeweils in eine Datei umgeleitet, die mittels der generate-id()-Funktion einen eindeutigen Namen erhält. Sollte das Element unbekannt sein und somit kein Splitten auf verschiedene Dateien durchgeführt werden, so wird eine HTML-Seite erzeugt und in diese werden alle Werte der Reihe nach eingefügt.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
  extension-element-prefixes="redirect">
 <xsl:output method="html" encoding="iso-8859-1"/>

 <xsl:template match="/">
  <xsl:choose>
   <!-- Schreiben in mehrere Dateien wird unterstuetzt -->
   <xsl:when test="element-available('redirect:write')">
     <!-- Alle Elemente im viele-Modus bearbeiten-->
     <xsl:apply-templates select="*" mode="viele"/>
   </xsl:when>
   <!-- Das Schreiben laesst sich nicht aufteilen -->   
   <xsl:otherwise>
     <!-- Erzeuge eine HTML-Seite, die alles enthaelt -->
     <html><head><title>
      <xsl:value-of select="text()"/></title></head>
      <body><h1><xsl:value-of select="text()"/></h1>
        <xsl:apply-templates select="*"/>
        <hr/>&#169; Tanja Schniederberend 				
      </body>
     </html>
   </xsl:otherwise>
  </xsl:choose>	
 </xsl:template>

 <!-- Fuer jedes Element den Text ausgeben -->
 <xsl:template match="*">
   <h1><xsl:value-of select="text()"/></h1>
   <xsl:apply-templates select="*"/>
 </xsl:template>

 <!-- Fuer jedes Element im viele-Modus -->
 <xsl:template match="*" mode="viele">
  <!-- eindeutige ID erzeugen -->
  <xsl:variable name="pos" select="generate-id(.)"/>
  <!-- in eine neue, eindeutige Datei schreiben -->
  <redirect:write select="concat($pos,'.html')">
    <html><head><title>
      <xsl:value-of select="text()"/></title></head>
      <body><h1><xsl:value-of select="text()"/></h1>
        <hr/>&#169; Tanja Schniederberend 				
      </body>
    </html>
  </redirect:write>
  <xsl:apply-templates select="*" mode="viele"/>
 </xsl:template>	
</xsl:stylesheet>

Abbildung 5: Ausgabe mit Saxon
\includegraphics[scale=0.5]{bilder/ausgabesaxon}

Abbildung 6: Ausgabe mit Xalan in verschiedene Dateien
[Das erste Element, das alle weiteren Elemente, aber keinen Text enthält] \resizebox*{0.45\textwidth}{!} {\includegraphics{bilder/ausgabexalan}} [erstes Kindelement] \resizebox*{0.45\textwidth}{!} {\includegraphics{bilder/ausgabexalan1}} [zweites Kindelement] \resizebox*{0.45\textwidth}{!} {\includegraphics{bilder/ausgabexalan2}} [drittes Kindelement] \resizebox*{0.45\textwidth}{!} {\includegraphics{bilder/ausgabexalan3}}

In dem Beispiel wurde allein die für Xalan gültige Erweiterung eingesetzt. Auch mit Saxon ist es möglich in mehrere Dateien zu schreiben, doch dafür müsste ein weiterer Fall zur Verarbeitung festgelegt werden. Die Unterstützung mehrerer Prozessoren ist nur mit einem sehr umfangreichen Stylesheet möglich. Um derartige Probleme und die Entwicklung verschiedenster XSLT-Prozessoren in unterschiedliche Richtungen zu vermeiden, ist aus einer Initiative von XSLT-Entwicklern das EXSLT-Projekt (Ëßteht für extensions - Erweiterungen)[EXSLT] entstanden. Wesentliche Aufgabe des Projektes ist die Dokumentation, wie Erweiterungen benutzt werden sollen, und die Angabe von Funktionen, die ein Prozessor unterstützen soll. Zum aktuellen Stand unterstützen zwar nur einige wenige Prozessoren diese Erweiterungen, aber dafür sind es die häufig eingesetzten, dazu gehören Xalan und Saxon. Wie weit sich dieses Projekt auf Dauer durchsetzt ist allerdings fraglich, zumal selbst die eben genannten Prozessoren nicht jede Erweiterung unterstützen. Wichtig ist aber, dass die innerhalb dieses Projektes definierten Erweiterungsfunktionen mit in die Diskussion um die Version 2.0 von XSLT aufgenommen wurden. Zwei häufig benötigte Funktionen, wie das Lesen aus Textdateien und das Schreiben in mehrere Ausgabedokumente, wurde bislang nur als Erweiterung der einzelnen Prozessoren implementiert, sind aber durch den hohen Bedarf mit in die Diskussion der Anforderungsliste an die nächste XSLT-Version aufgenommen worden. Die Aufnahme und Standardisierung derartiger Funktionen wird in der Zukunft wieder für eine hohe Unabhängigkeit von den Prozessoren sorgen und eine Vereinfachung der Entwicklung mit sich ziehen. Bereits zum aktuellen Stand des Arbeitspapiers zur Version 2.0 von XSLT unterstützt Saxon in der Version 7.4 wichtige Funktionen, wie das Ausgeben in mehrere Dokumente, anhand der Vorgaben des Arbeitspapieres. Innerhalb dieser Entwicklungsphase kann sich natürlich noch einiges ändern. Dennoch ist daraus eine Tendenz zu erkennen. Weitere Beispiele für neue Funktionalitäten von XSLT sind die Ergänzung um XQuery, eine XML-basierte Datenabfragesprache, und die Unterstützung von Datentypen aus XML-Dokumenten, wenn diese anhand eines XML Schemas definiert wurden. Bei der Erstellung von Stylesheets, die mehrere Prozessoren unterstützen, ist es somit um so wichtiger auf die Version des unterstützten XSLT zu achten und diese Versionen zu unterscheiden.
next up previous contents
Nächste Seite: 4 XSL-FO Aufwärts: 3 XSLT Vorherige Seite: 3.5 Funktionen   Inhalt
Tanja Schniederberend 2003-06-11