2.3  Aktuelle und vergangene Anwendungen

Wie auch bei anderen Programmiersprachen, hat es einige Zeit gedauert bis sich für XSLT der optimale Anwendungsbereich herauskristallisiert hat. Auch bei XSLT war ursprünglich das Internet und insbesondere Webseitenprogrammierung die treibende Kraft, da mittels XSLT besonders gut Inhalt und Semantik getrennt werden konnte.
Relativ schnell hat sich aber CSS in Verbindung mit JavaScript als Standardlösung für diesen Zeck bewährt. XSLT ist inzwischen Platzhirsch im Bereich Technische Dokumentation, und hier auch wohl unschlagbar.

2.3.1  XML Webseiten

Einen XSLT Prozessor hat jeder Browser eingebaut. Es war mal sehr populär, Webseiten als XML auszuliefern und mittels XSLT zu layouten. U.a. wegen des exzessiven Einsatzes von JavaScript (auch inline), hat sich diese Idee nie vollständig durchgesetzt. Schliesslich wurde XHTML spezifiziert und jetzt gibt es HTML5.
Betrachten wir das folgende XML Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<title>Das ultimative Zwei-Kapitel Dokument</title>
  <chapter>
    <title>Kapitel 1</title>
    <intro>In Kapitel 1 wird kurz gesagt was Sache ist.</intro>
    <content>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</content>
  </chapter>
  <chapter>
    <title>Kapitel 2</title>
    <intro>Hier wird erklärt, wie der Hase läuft.</intro>
    <content>Im Prinzip ist es ganz einfach.</content>
  </chapter>
</document>
Ohne XSLT Stylesheet Zuweisung wird der Browser eine Datei mit diesem Inhalt als eingerücktes XML anzeigen - oder die Tags einfach ignorieren und den Textinhalt in einer Zeile darstellen. Fügt man eine Processing Instruction ↗↗ am Anfang ein, wird ein XSLT Stylesheet vom Browser herangezogen, und vor der Darstellung im Browser wird die so deklarierte XML Transformation ausgeführt:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="formatiermich.xsl" ?>
<document>
  <title>Das ultimative Zwei-Kapitel Dokument</title>
  <chapter>
[...]
Das XML kann nun im Browser geöffnet werden. Alles wird schön formatiert angezeigt...
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

  <xsl:template match="document">
  <body>
      <xsl:apply-templates/>
    </body>
  </xsl:template>

  <xsl:template match="document/title">     
    <h1>
      <xsl:apply-templates/>
    </h1>
  </xsl:template>

  <xsl:template match="chapter">
    <div class="chapter">
      <xsl:apply-templates/>
    </div>
  </xsl:template>

  <xsl:template match="chapter/title">
    <h2>
      <xsl:apply-templates/>
    </h2>
  </xsl:template>

  <xsl:template match="chapter/intro">
    <div class="intro">
      <i><xsl:apply-templates/></i>      
    </div>
  </xsl:template>

  <xsl:template match="chapter/content">
    <p><xsl:apply-templates/></p>    
  </xsl:template>
</xsl:stylesheet>
Die Processing Instruction hat keinen Einfluss auf den XML Inhalt und wird in einer anderen Eingabeverarbeitung nicht herangezogen.

2.3.2  Serverseitige Konvertierung

Auch eine serverseitige Konvertierung ist gebräuchlich. Ein Beispiel aus vergangenen Tagen - WAP-Seiten ↗↗ für unterschiedliche Handy-Modelle.
Früher hatten die Handys sehr unterschiedliche Displaygrößen. Handybrowser konnten nicht ausreichend JavaScript und die Skalierung der WAP-Seite für das jeweilige Handy passierte nicht im Handy, sondern vor der Auslieferung auf der Serverseite. Dazu wurde eine XML Quelle mittels verschiedener XSLT Stylesheets in unterschiedliche WML WAP Repräsentationen transformiert.
So würde das Zwei-Kapitel Beispiel von oben im WML Format aussehen (recht einfach gehalten):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wap.org/DTD/wml_1.1.xml">
<wml>
  <head>
    <meta name="title" content="Das ultimative Zwei-Kapitel Dokument"/>   
  </head> 
  <card id="chapter1" title="Kapitel 1">
    <p><i>In Kapitel 1 wird kurz gesagt was Sache ist.</i></p>        
    <p>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</p>  
  </card>
  <card id="chapter2" title="Kapitel 2">
    <p><i>Hier wird erklärt, wie der Hase läuft.</i></p>
    <p>Im Prinzip ist es ganz einfach.</p>
  </card>
</wml>
Eine XSLT Transformation, die die XML Daten von oben in diese WML Darstellung überführt, könnte z.B. so implementiert werden:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output
    doctype-public="-//WAPFORUM//DTD WML 1.2//EN" 
    doctype-system="http://www.wapforum.org/DTD/wml12.dtd"
    indent="yes"/>
    
  <xsl:template match="document">
    <wml>
      <xsl:apply-templates/>
    </wml>
  </xsl:template>
    
  <xsl:template match="document/title">
    <head>
      <meta name="title">
        <xsl:attribute name="content">
          <xsl:value-of select="."/>               
        </xsl:attribute>
      </meta>      
    </head>
  </xsl:template>
    
  <xsl:template match="chapter">
    <card id="{concat('chapter',count(preceding-sibling::chapter)+1)}">
      <xsl:attribute name="title">
        <xsl:value-of select="title"/>
      </xsl:attribute>
      <xsl:apply-templates select="*[not(self::title)]"/>
    </card>
  </xsl:template>
  
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="processing-instruction()"/>
  
  <xsl:template match="intro">
    <p><i><xsl:apply-templates/></i></p>
  </xsl:template>
  
  <xsl:template match="content">
    <p><xsl:apply-templates/></p>
  </xsl:template>
</xsl:stylesheet>

2.3.3  Multiple Ausgabeformate

Aus einer XML Quelle können auch leicht weitere Format erzeugt werden, bspw. EPUB ↗↗ Das ist das Standardformat für eBooks. Neben Tags zur Formatierung für den Content, gibt es bspw. auch Anweisungen zum Erzeugen des Inhaltsverzeichnisses oder anderer Navigationsstrukturen.
Weitere gängige Formate sind neben dem oben veralteten WML Format, elektronische Ausgabe-Formate wie: CHM ↗↗, EclipseHelp ↗↗, JavaHelp ↗↗, ..., Print-Ausgabe Formate, wie PDF oder Adobe Framemaker ↗↗, oder XML Standard Austauschformate, wie DITA, S1000D, PI-MOD ↗↗, JATS ↗↗ oder TEI ↗↗.

2.3.4  Menschenlesbare Ausgabe

Kryptische XML Log-, Daten- oder Konfigurationsfiles können leicht mit XSLT "menschenlesbar" formatiert werden. Ein Arbeitskollege im neuen Job kam kürzlich auf mich zu, ob ich um eine Möglichkeit wüsste, wie man sein kryptisches Datenfile für einen Übersetzungsdienst formatieren könnte:
<?xml version="1.0" encoding="UTF-8"?>?<?xml-stylesheet type="text/xsl" href="de.xsl"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
  xmlns:jcr="http://www.jcp.org/jcr/1.0" 
  xmlns:mix="http://www.jcp.org/jcr/mix/1.0"
  xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
  jcr:language="de"
  jcr:mixinTypes="[mix:language]"
  jcr:primaryType="sling:Folder">
<b_manual 
  jcr:primaryType="sling:MessageEntry"
  sling:message="Bedienungsanleitung"/>
  <b_warning
    jcr:primaryType="sling:MessageEntry"
    sling:message="Warnung"/>
  <b_danger
    jcr:primaryType="sling:MessageEntry"
    sling:message="Vorsicht"/>
  <b_note
    jcr:primaryType="sling:MessageEntry"
    sling:message="Notiz"/>
  <b_notice
    jcr:primaryType="sling:MessageEntry"
    sling:message="Hinweis"/>
  [...]
Mit einem eingehängten XSLT Stylesheet de.xsl wird so ein Datenfile als Tabelle formatiert:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:jcr="http://www.jcp.org/jcr/1.0"
  xmlns:sling="http://sling.apache.org/jcr/sling/1.0">
  
  <xsl:template match="jcr:root">
    <html>
      <table border="1" cellpadding="5" cellspacing="5">
        <xsl:apply-templates/>
      </table>
    </html>
  </xsl:template>
  
  <xsl:template match="*">
    <tr>
      <td>
        <xsl:value-of select="concat(count(preceding::*[@sling:message]) + 1,'.')"/>
      </td>
      <td>
        <xsl:value-of select="name()"/>
      </td>
      <td contenteditable="true">
        <xsl:value-of select="@sling:message"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>
Hängt man an dieses Beispiel noch ein bisschen JavaScript Logik und macht die Felder für die Übersetzungen mittels des HTML5 contenteditable Attributs editierbar, dann bräuchte man nur noch eine Rücktransformation HTML nach XML und hätte schon einen kleinen XML Editor gebaut. So funktioniert auch der Editor in Tektur.

2.3.5  Diagramme darstellen

Nachdem eine SVG Grafik im XML Format vorliegt, kann diese auch direkt mittels XSLT erzeugt werden. Über das HTML5 <svg> Element kann so eine Grafik inline in das - ebenfalls durch das XSLT - generierte HTML Dokument eingebunden werden.
Betrachten wir unser Beispiel von oben, erweitert um drei neue <block> Elemente:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="chart.xsl" ?>
<document>
  <title>Das ultimative Zwei-Kapitel Dokument</title>
  <chapter>
    <title>Kapitel 1</title>
    <intro>In Kapitel 1 wird kurz gesagt was Sache ist.</intro>
    <content>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</content>
  </chapter>
  <chapter>
    <title>Kapitel 2</title>
    <intro>Hier wird erklärt, wie der Hase läuft.</intro>
    <content>Im Prinzip ist es ganz einfach. Betrachten wir doch drei gelbe Blöcke:
    </content>
    <block/>
    <block/>
    <block/>
  </chapter>
</document>
Wenn wir das XSLT Stylesheet noch um eine Regel für das neue <block> Element ergänzen, so wie hier:
<xsl:template match="block">
   <svg style="background-color:yellow" width="30" height="30" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns="http://www.w3.org/2000/svg"/>
  <br/>
  <br/>
</xsl:template>
Dann erhalten wir drei schön formatierte gelbe SVG Blöcke ...
Weiterführende Links:
Previous Page Next Page
Version: 93
Jan 25 2021