next up previous contents
Nächste Seite: 8.3.4 MathML Aufwärts: 8.3 Generierung der Ausgabe Vorherige Seite: 8.3.2 Sprachunterstützung   Inhalt


8.3.3 Flexibilität der Stylesheet Prozessoren

Der Einsatz von XML-Dokumenten als Grundlage für die Daten und XSLT zur Generierung der Ausgabe, hält sich an einen Standard, der nicht von etwaigen Programmen abhängig macht. Doch das gilt nur, solange auch die XSLT-Prozessoren sich alle an den Standard halten und diesen vollständig abdecken. In Anbetracht der Aktualität von XSLT ist das jedoch nicht ganz der Fall. Zum einen ist die Unterstützung nicht bei allen Prozessoren vollständig gegeben, wie auch schon in Kapitel 3.5 angesprochen, und zum anderen fehlen wichtige Funktionen. Darunter fallen die Ausgabe in mehrere Dateien und die Integration von Dateien, die nicht auf XML basieren. Um derartige Funktionalitäten zu erreichen müssen Erweiterungsfunktionen eingesetzt werden, die allerdings abhängig von dem eingesetzten XSLT-Prozessor sind, vgl. Kapitel 3.6. Für die Realisierung wurde die Unterstützung von Xalan zur Ausgabe in mehrere Dateien benutzt. Ebenso wurde für den Fall, dass ein anderer Prozessor eingesetzt wird, eine Abfrage eingebaut, die dann die Ausgabe in eine einzelne Datei umlenkt, wie es mit den Standardfunktionalitäten von XSLT möglich ist. Auch mit der Unterstützung von Saxon wurde experimentiert, der in seiner aktuellen Version schon einige Funktionalitäten der Diskussion um XSLT 2.0 unterstützt, die aber noch nicht standardisiert sind. Die dementsprechenden Elemente sind noch nicht in anderen XSLT-Prozessoren verfügbar, weshalb diese einen Fehler melden. Die Aufteilung auf mehrere Dateien wurde deshalb mit Xalan umgesetzt, der sich sehr genau an den Standard hält.

Code-Beispiel 10:
Beispiel zum Aufteilen auf Dateien und Abfang von Prozessoren Der Test, ob das von Xalan unterstützte Schreiben in externe Dateien aufgerufen werden kann, findet anhand der Verfügbarkeit des redirect:write-Elementes statt und wird in der Variablen xalan_redirect abgespeichert. Anhand dieses Testergebnisses werden an unterschiedlichen Stellen verschiedene Ausgaben erstellt. So wird wie schon in Beispiel 3.6.1 beschrieben die Ausgabe auf eine oder mehrere Dateien verteilt. Wichtig ist dabei die unterschiedliche Behandlung einiger Elemente zu berücksichtigen, wie beispielsweise Links innerhalb des Dokumentes oder Fußnoten.
<xsl:variable name="xalan_redirect" 
     select="element-available('redirect:write')"/>

<xsl:template match="/">
 <xsl:choose>
  <!-- Der Xalan unterstuetzt das Aufteilen in mehrere Dateien 
    durch ein eigenes Element -->
  <xsl:when test="$xalan_redirect">
   <!-- Startseite schreiben -->
   <redirect:write select="'index.xhtml'">
    <!-- Der Seitenkopf bleibt gleich -->
    <xsl:processing-instruction name="xml-stylesheet">
     <xsl:text>href="insert/mathmlstyle/mathml.xsl" 
               type="text/xsl"</xsl:text>
    </xsl:processing-instruction>
    <html>
     <head>
      <title>
       <xsl:value-of select="lec:lecture/lec:title"/>
      </title>
     <link rel="stylesheet" type="text/css" href="format.css"/>
     </head>
     <!-- Seitenkörper mit Inhalt -->
     <body>
      <!-- Beginn der Seite ist immer gleich -->
      <xsl:call-template name="firstside"/>
       <!-- Abstrakt und gesamten Inhalt aufrufen -->
      <xsl:apply-templates select="lec:lecture/lec:abstract | 
                                    lec:lecture/lec:content"/>
      <!-- Fussnoten, die nicht in Unterkapiteln stecken -->
      <xsl:if test="lec:lecture/lec:content/*
               [not(local-name()='chapter')]//lec:footnote | 
               lec:lecture/*[not(local-name()='content')]
               //lec:footnote">
       <p>
        <xsl:apply-templates select="lec:lecture/lec:content/*     
          [not(local-name()='chapter')]//lec:footnote |      
          lec:lecture/*[not(local-name()='content')]
          //lec:footnote" mode="annotation"/>
       </p>
       <hr/>
      </xsl:if>
      <!-- Seitennavigation einfügen-->
      <xsl:call-template name="navigation">
       <xsl:with-param name="back" select="''"/>
       <xsl:with-param name="next" select="'inhalt'"/>
      </xsl:call-template>
     </body>
    </html>
   </redirect:write>
   <!-- Verarbeitung des Inhaltsverzeichnisses -->
   <!-- ... -->
   <!-- Verarbeitung des Literaturverzeichnisses -->
   <!-- ... -->
  </xsl:when>
  <!-- Prozessor kann nur in eine Datei schreiben -->
  <xsl:otherwise>
   <!-- Seitenkopf einfügen, siehe oben -->
   <!-- ... -->
   <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <!-- ... -->
    </head>
    <body>
     <!-- Erste Seite aufbauen -->
     <xsl:call-template name="firstside"/>
     <!-- Alle Inhalte zur Verarbeitung aufrufen -->
     <xsl:apply-templates select="lec:lecture/lec:abstract | 
                         lec:lecture/lec:content | 
                         lec:lecture/lec:bibliography | 
                         lec:lecture/lec:table_of_contents | 
                         lec:lecture/lec:content/lec:chapter"/>
     <!-- Alle Fussnoten an die Seite anhaengen -->
     <p>
      <xsl:apply-templates select="//lec:footnote" 
                                 mode="annotation"/>
     </p>
     <hr/>
    </body>
   </html>
  </xsl:otherwise>
 </xsl:choose>
</xsl:template>
Beim Verteilen der Ausgabe auf mehrere Dateien ist zu beachten, dass diese unterschiedliche Bezeichnungen haben. Wird beispielsweise beim Aufruf des Prozessors zur Generierung eine Datei index.xhtml angegeben, so kollidiert diese mit der von dem Stylesheet erzeugten index.xhtml-Datei. Werden derartige gleichzeitig schreibende Zugriffe auf eine Datei gemacht, so können Daten verloren gehen.
next up previous contents
Nächste Seite: 8.3.4 MathML Aufwärts: 8.3 Generierung der Ausgabe Vorherige Seite: 8.3.2 Sprachunterstützung   Inhalt
Tanja Schniederberend 2003-06-11