SELFHTML: XML / Darstellung von XML-Daten / Beispiele für XSLT
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Wie XSLT funktioniert - Erklärungen anhand von Beispielen.
Keywords: SELFHTML, XML, XSLT, Transformation
Date: 2005-08-22T21:21:39+02:00

| # Beispiele für XSLT
| Hinweise zu den Beispielen Erstes Beispiel: ein Gruß Zweites Beispiel: Text mit Formatierungen Drittes Beispiel: Text mit Hyperlinks (Grafik und Multimedia) Viertes Beispiel: ein Glossar als Tabelle

## Hinweise zu den Beispielen

Um mit den Konzepten von XSLT vertraut zu werden, empfiehlt es sich, alle Beispiele auf dieser Seite der Reihe nach durchzuarbeiten und zu verstehen.

Die Beispiele decken ein paar typische Einsatzmöglichkeiten von XSLT ab. Die Möglichkeiten der Sprache sind damit jedoch noch nicht ausgeschöpft. XSLT ist ja selbst eine XML-gerechte Sprache und besteht aus bestimmten Elementen und Attributen. Eine systematische Übersicht dazu finden Sie im Abschnitt XSLT-Elemente.

Der Microsoft Internet Explorer 5.x hat je nach Auslieferungstyp Probleme mit diesen Beispielen. Der Grund ist, dass er mit einem veralteten XSLT-Parser ausgeliefert wurde und teilweise noch wird. Dieser Parser interpretiert XSLT basierend auf einem älteren Working Draft des W3-Konsortiums, der aber mittlerweile technisch längst überholt und durch die XSLT-1.0-Empfehlung ersetzt worden ist. Unglücklicherweise sind durch die Verbreitung des Internet Explorers auf diese Weise Millionen von Kopien eines völlig unbrauchbaren XSLT-Parsers in die Welt gelangt. Obwohl Microsoft längst Updates zu dem unbrauchbaren Werkzeug anbietet, ist nicht mehr zu verhindern, dass viele Anwender einen Internet Explorer besitzen, der XSLT-Übersetzungen nur über abenteuerliche Umwege und nur sehr unvollständig interpretiert. Deshalb bleibt der sinnvolle Einsatz von XSLT bis auf weiteres wohl nur server-seitig möglich. Einzelheiten zu der XSLT-Implementierung des Internet Explorers können Sie im Web z.B. in der Unofficial MSXML XSLT FAQ nachlesen.

In den Beispielen auf dieser und den folgenden Seiten wird auf die ältere Implementierung des Internet Explorers keine Rücksicht genommen. XSLT wird so beschrieben, wie es heute verwendet werden sollte. Um die Beispiele nachzuvollziehen, gibt es z.B. Software-Werkzeuge wie Saxon oder Xt. Im Link-Verzeichnis des Online-Angebots von SELFHTML aktuell finden Sie Links zu solcher Link-Verzeichnis: XML-Software.

Beispielhaft sei die Arbeit mit Saxon beschrieben. Dieses Programm ist ein reiner XSLT-Parser, der aus einer XML-Datei und einem XSLT-Stylesheet eine Ausgabedatei aufgrund der XSLT-Definitionen erzeugt. Saxon ist rein kommandozeilenorientiert (für Windows-Anwender gibt es eine Version, die im DOS-Fenster lauffähig ist). Dadurch ist Saxon auch hervorragend geeignet, um beispielsweise von CGI ausgeführt zu werden, die XML-Daten in HTML-Form an einen aufrufenden Browser senden wollen.

Ein einfacher Aufruf von Saxon lautet:
`saxon meinedaten.xml meine.xsl >ausgabe.html`

Dabei ist meinedaten.xml eine Datei mit einer XML-Datenstruktur. Die Datei meine.xsl enthält XSLT-Definitionen, wie XML-Datenstrukturen aus XML-Daten wie denen der meinedaten.xml in HTML übersetzt werden sollen. ausgabe.html ist der Name der HTML-Datei, die aus den XML-Ausgangsdaten und den Definitionen zur HTML-Übersetzung erzeugt werden soll.

Auch in Verbindung mit CGI-Scripts lässt sich ein Programm wie Saxon hervorragend einsetzen. Wenn Sie sich mit CGI und Perl beschäftigen, finden Sie im Abschnitt qx(...) - Andere Programme/Scripts ausführen und STDOUT auffangen ein Beispiel beschrieben, wie Sie server-seitig gespeicherte XML-Daten mit Hilfe von Saxon und Perl als HTML-Code an den aufrufenden Browser senden lassen können.

Die Beispiele dieser und der folgenden Seiten wurden auf diese Weise mit Saxon von XML nach HTML übersetzt. Die HTML-Ergebnisdateien sind als Anzeigebeispiele aufrufbar. Ebenfalls aufrufbar sind die XML-Dateien.

## Erstes Beispiel: ein Gruß

Das erste Beispiel zeigt den einfachsten möglichen Fall: es gibt eine DTD, in der nur ein einziges Element definiert wird. Die XML-Anwendungsdatei ist entsprechend einfach. Eine XSL-Datei, die XSLT-Anweisungen enthält, sorgt für eine Transformation nach HTML.

Anzeigebeispiel: So sieht's aus (Ergebnisdatei gruss.htm)
Anzeigebeispiel: So sieht's aus (Datei gruss.xml - XML/XSLT-fähiger Browser erforderlich)

### Beispiel-DTD gruss.dtd:

    <!ELEMENT gruss (#PCDATA)>

### Beispiel einer gültigen Anwendung gruss.xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE gruss SYSTEM "gruss.dtd">
    <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>

    <gruss>hallo Welt!</gruss>

### Beispiel der eingebundenen XSL-Datei gruss.xsl:

    <?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><head></head><body>
     <p align="center" style="font-family:Tahoma; font-size:64px; color:red">
      <xsl:value-of select="." />
     </p>
     </body></html>
    </xsl:template>

    </xsl:stylesheet>

### Erläuterung:

In der Beispiel-DTD, die separat in einer Datei namens gruss.dtd gespeichert wird, wird das einzige Element des kleinen Beispiels, nämlich das Dokument-Element `gruss`, definiert. Einzelheiten zu solchen Elementdefinitionen finden Sie im Abschnitt Elemente und Verschachtelungsregeln.

In der XML-Anwendungsdatei gruss.xml wird in einer Dokumenttyp-Deklaration mit externer DTD auf die zuvor erstellte DTD Bezug genommen. Gleich im Anschluss an die Dokumenttyp-Deklaration, noch vor den eigentlichen Nutzdaten der Datei, folgt eine Anweisung, mit deren Hilfe eine XSL-Datei eingebunden wird:
`<?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>`

Es handelt sich um eine Verarbeitungsanweisung an die verarbeitende Software. Durch die Notation `xml-stylesheet` weiß die verarbeitende Software, dass die nachfolgenden Attribute eine separate Stylesheet-Datei einbinden. Mit dem `href`-Attribut wird die Datei referenziert. Ebenfalls wichtig ist das Attribut `type`. Bei Verwendung von XSL erwartet der XML-Parser bei diesem Attribut den Wert `text/xsl`.

Von Interesse ist nun der Aufbau der XSL-Datei, im Beispiel die Datei gruss.xsl. XSL-Stylesheet-Dateien erhalten üblicherweise die Endung .xsl. Da es sich bei XSL-Dateien ebenfalls um XML-gerechte Dateien handelt, beginnt die Datei wie üblich mit einer XML-Deklaration (im Beispiel: `<?xml version="1.0" encoding="ISO-8859-1"?>`).

Der gesamte Inhalt der XSL-Datei ist in `<xsl:stylesheet...>...</xsl:stylesheet>` eingeschlossen. Die Notation mit dem Doppelpunkt ist die typische Notation, wenn in einer Datei mehrere XML-Namensräume eingesetzt werden. Im einleitenden Tag wird angegeben, welche Namensräume verwendet werden. Anzugeben ist auf jeden Fall der Namensraum von XSL, der verwendet werden soll. Dabei sollten Sie `http://www.w3.org/1999/XSL/Transform` als Namensraum angeben. Der ältere Parser des Microsoft Internet Explorers kann die Daten dann freilich nicht verarbeiten. Moderne XSL-Parser dagegen erwarten diese Angabe.
Mit einem zweiten `xmlns`-Attribut im einleitenden `<xsl:stylesheet>`-Tag können Sie außerdem den Namensraum der gewünschten Ergebnissprache angeben. Im obigen Beispiel wurde darauf verzichtet. Wenn Sie jedoch ein XML-gerechtes Ergebnisdokument benötigen, müssen Sie dessen Namensraum angeben. Mit einer Angabe wie `xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"` geben Sie beispielsweise den Namensraum von XHTML 1.0 in der Variante Transitional an.

Alle einleitenden und schließenden Tags innerhalb von `<xsl:stylesheet...>...</xsl:stylesheet>`, die zum Namensraum von XSL gehören, sind an der Notation `<xsl:...>...</xsl:...>` erkennbar. Der Namensraum, mit dem XSL eingebunden wird, muss übrigens nicht zwingend `xsl` lauten, doch hat sich dieser Name verständlicherweise eingebürgert.

Das obige Beispiel fährt fort mit `<xsl:template match="/">` (engl. template = dt. Schablone). `xsl:template` erhält im einleitenden Tag stets ein Attribut namens `match`, bei dem Sie angeben, welches Element aus Ihren XML-Daten transformiert werden soll. Mit der Angabe `match="/"` beziehen Sie sich auf die Dokumentwurzel der XML-Daten, repräsentiert durch das Element `gruss`, angewendet in dem Tag-Paar `<gruss>...</gruss>`.

Nachdem Sie mit `match` ausgewählt haben, auf welches XML-Element Sie sich bei der folgenden Template-Definition beziehen, können Sie als Inhalt des `xsl:template`-Elements notieren, wie das ausgewählte XML-Element transformiert werden soll. Da in HTML transformiert werden soll, wird also als Inhalt von `xsl:template` der gewünschte HTML-Code notiert. Im obigen Beispiel ist das eine vollständige kleine HTML-Datei. Der Grund dafür ist, dass mit `match="/"` ja die Dokumentwurzel der XML-Daten ausgewählt wurde. Da als Ergebnis eine vollständige HTML-Datei erzeugt werden soll, wird die Dokumentwurzel der XML-Daten in das typische Grundgerüst einer HTML-Datei transformiert.

Innerhalb des HTML-Codes soll nun an einer gewünschten Stelle, im Beispiel zwischen `<body>` und `</body>` in einem Absatz `<p>...</p>`, der Inhalt von `<gruss>...</gruss>` ausgegeben werden. Dazu dient im Stylesheet der Befehl `<xsl:value-of select="." />` (engl. value-of = dt. Wert von). Die Angabe `select="."` bedeutet so viel wie "wähle den vollständigen Inhalt des aktuellen Elements aus". Damit die HTML-Ausgabe etwas attraktiver aussieht, enthält das einleitende `<p>`-Tag Formatierungsangaben. Auch CSS-Angaben sind dabei, wie Sie am Beispiel sehen können, erlaubt. Bei der Transformation wird an der entsprechenden Stelle also folgender HTML-Code erzeugt:
`<p align="center" style="font-family:Tahoma; font-size:64px; color:red">
hallo Welt!
</p>`

## Zweites Beispiel: Text mit Formatierungen

Das Gruß-Beispiel hat eine starre XML-Struktur. Laut DTD-Definition darf darin genau einmal `<gruss>...</gruss>` notiert werden mit einem Grußtext als Inhalt. Das folgende Beispiel zeigt eine Datenstruktur, in der es ein Text-Element gibt, dass beliebig oft vorkommen kann, und das auch noch weitere, innere Elemente enthalten kann. Das Beispiel behandelt eine Produktnews-Datei, in der Nachrichten über neue Produkte auf dem Software-Markt gesammelt werden.
Die XSLT-Angaben zur Transformation nach HTML müssen in diesem komplexeren Beispiel etwas anders aufgebaut werden.

Anzeigebeispiel: So sieht's aus (Ergebnisdatei produktnews.htm)
Anzeigebeispiel: So sieht's aus (Datei produktnews.xml - XML/XSLT-fähiger Browser erforderlich)

### Beispiel-DTD produktnews.dtd:

    <!ELEMENT produktnews (#PCDATA | beschreibung)*>
    <!ELEMENT beschreibung (#PCDATA | hersteller | produkt | preis)*>
    <!ELEMENT hersteller (#PCDATA)>
    <!ELEMENT produkt (#PCDATA)>
    <!ELEMENT preis (#PCDATA)>

### Beispiel einer gültigen Anwendung produktnews.xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE produktnews SYSTEM "produktnews.dtd">
    <?xml-stylesheet type="text/xsl" href="produktnews.xsl" ?>
    <produktnews>

    Die neuesten Produktnachrichten:

    <beschreibung>
    Die Firma <hersteller>Fridolin Soft</hersteller> hat eine neue Version des
    beliebten Ballerspiels <produkt>HitYourStick</produkt> herausgebracht.
    Nach Angaben des Herstellers soll die neue Version, die nun auch auf dem
    Betriebssystem <produkt>Ganzfix</produkt> läuft, um die <preis>80 Dollar</preis>
    kosten.
    </beschreibung>

    <beschreibung>
    Von <hersteller>Ripfiles Inc.</hersteller> gibt es ein Patch zu der Sammel-CD-ROM
    <produkt>Best of other people's ideas</produkt>. Einige der tollen
    Web-Seiten-Templates der CD-ROM enthielten bekanntlich noch versehentlich nicht
    gelöschte Angaben der Original-Autoren. Das Patch ist für schlappe
    <preis>200 Euro</preis> zu haben.
    </beschreibung>

    </produktnews>

### Beispiel der eingebundenen XSL-Datei produktnews.xsl:

    <?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><head></head><body style="font-family:Verdana; font-size:24px; color:green">
      <xsl:apply-templates />
     </body></html>
    </xsl:template>

    <xsl:template match="beschreibung">
     <p style="font-family:Verdana; font-size:13px; color:black">
       <xsl:apply-templates />
     </p>
    </xsl:template>

    <xsl:template match="hersteller">
     <span style="font-weight:bold; color:red"><xsl:value-of select="." /></span>
    </xsl:template>

    <xsl:template match="produkt">
     <span style="font-weight:bold; color:blue"><xsl:value-of select="." /></span>
    </xsl:template>

    <xsl:template match="preis">
     <b><xsl:value-of select="." /></b>
    </xsl:template>

    </xsl:stylesheet>

### Erläuterung:

Das Beispiel definiert in der DTD produktnews.dtd die gewünschten Elemente und ihre Verschachtelungsregeln. In der Anwendungsdatei produktnews.xml sehen Sie ein Beispiel, wie diese Definitionen korrekt umgesetzt werden. Einzelheiten zu solchen Elementdefinitionen in DTDs finden Sie im Abschnitt Elemente und Verschachtelungsregeln.

Genau wie im Gruß-Beispiel wird in der XML-Datei wieder die XSL-Datei mit den Angaben zur Transformation nach HTML eingebunden. Die XSL-Datei - hier mit Namen produktnews.xsl - hat auch wieder das typische Grundgerüst, bestehend aus dem `xsl:stylesheet`-Element, das den Bezug zum Namensraum von XSL herstellt.

Wie im Gruß-Beispiel wird die Dokumentwurzel mit `<xsl:template match="/">` angesprochen. Zwischen diesem einleitenden Tag und seinem Gegenstück `</xsl:template>` wird das HTML-Grundgerüst für die Transformation notiert. Innerhalb von `<body>...</body>` ist in diesem Beispiel jedoch nur das leere Element `<xsl:apply-templates />` notiert (engl. apply-templates = dt. Schablonen anwenden). Mit dieser Angabe weisen Sie den XSLT-Parser an, an der entsprechenden Stelle Templates anzuwenden, die außerhalb des aktuellen `xsl:template`-Elements notiert sind.
Dass in diesem Beispiel mehrere einzelne Template-Definitionen mit je eigenen `xsl:template`-Elementen benötigt werden, liegt daran, dass der Inhalt, der in der HTML-Ausgabe zwischen `<body>...</body>` folgt, keinen starren Aufbau hat. So können innerhalb des Wurzelelements `produktnews` sowohl Text als auch beliebig viele Elemente vom Typ `beschreibung` und deren Kindelemente vorkommen. Die Angabe `<xsl:apply-templates />` können Sie also lesen wie "beachte für Elemente, die innerhalb dieses Elements vorkommen, die separat definierten Templates für die betreffenden Elemente".

Die zweite Template-Definition im Beispiel beginnt mit `<xsl:template match="beschreibung">`. Damit geben Sie an, dass der folgende HTML-Code für alle Inhalte des Elementtyps `beschreibung` gilt. Im Beispiel wird für solche Elemente jeweils ein HTML-Absatz `<p>...</p>` mit gewünschten Formatierungen erzeugt. Innerhalb dieses `xsl:template`-Elements ist wieder nur `<xsl:apply-templates />` notiert. Der Grund ist auch in diesem Fall wieder, dass Elemente vom Typ `beschreibung` gemischten Inhalt mit weiteren möglichen Kindelementen enthalten können. Für diese Kindelemente werden wiederum eigene Templates definiert, die durch die Anweisung `<xsl:apply-templates />` berücksichtigt werden.

Für jeden der möglichen Kindelementtypen von `beschreibung`, im Beispiel die Typen `hersteller`, `produkt` und `preis`, werden Templates nach dem gleichen Muster angelegt. Da diese drei Elemente selbst keine weiteren Elemente mehr, sondern nur noch Zeicheninhalt (`#PCDATA`) enthalten können, beziehen sich die Angaben für die HTML-Formatierung einfach auf deren Inhalt. Den Inhalt müssen Sie dabei wie im Gruß-Beispiel mit `<xsl:value-of select="." />` referenzieren.

## Drittes Beispiel: Text mit Hyperlinks (Grafik und Multimedia)

In den beiden ersten Beispielen wurde nur mit Elementen gearbeitet. Im Fall der Hyperlinks muss beim Erzeugen der HTML-Ausgabe jedoch auf ein einzelnes Attribut zugegriffen werden, nämlich auf das `href`-Attribut des `a`-Elements. Auch das ist mit XSLT möglich. Ebenso ist es, wenn Sie Grafiken oder Multimedia einbinden wollen. Dann müssen Sie beispielsweise auf das `src`-Attribut des `img`-Elements oder das `data`-Attribut des `object`-Elements zugreifen. Das folgende Beispiel demonstriert dies anhand der Hyperlinks.

Anzeigebeispiel: So sieht's aus (Ergebnisdatei linktext.htm)
Anzeigebeispiel: So sieht's aus (Datei linktext.xml - XML/XSLT-fähiger Browser erforderlich)

### Beispiel-DTD linktext.dtd:

    <!ELEMENT linktext (#PCDATA | link)*>
    <!ELEMENT link (#PCDATA)>

### Beispiel einer gültigen Anwendung linktext.xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE linktext SYSTEM "linktext.dtd">
    <?xml-stylesheet type="text/xsl" href="linktext.xsl" ?>
    <linktext>
    Unter der Adresse <link>http://www.w3.org/Style/XSL/</link> finden Interessierte
    die Einstiegsseite des W3-Konsortiums zu XSL.
    </linktext>

### Beispiel der eingebundenen XSL-Datei linktext.xsl:

    <?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><head></head><body bgcolor="#FFFFFF" text="#000000" link="#FF0000" vlink="#AA0000" alink="#000000" style="font-family:Arial; font-size:13px;">
      <xsl:apply-templates />
     </body></html>
    </xsl:template>

    <xsl:template match="link">
     <a><xsl:attribute name="href"><xsl:value-of select="." /></xsl:attribute>
     <xsl:value-of select="." /></a>
    </xsl:template>

    </xsl:stylesheet>

### Erläuterung:

Das Beispiel definiert in der DTD linktext.dtd die gewünschten Elemente. In der Anwendungsdatei linktext.xml sehen Sie ein Beispiel, wie diese Definitionen korrekt umgesetzt werden. Einzelheiten zu solchen Elementdefinitionen in DTDs finden Sie im Abschnitt Elemente (Tags) und Verschachtelungsregeln.

Genau wie im Gruß-Beispiel wird in der XML-Datei wieder die XSL-Datei mit den Angaben zur Transformation nach HTML eingebunden. Die XSL-Datei - hier mit Namen linktext.xsl - hat auch wieder das typische Grundgerüst.

Wie im Text-Beispiel kann das Dokument-Element `linktext` in diesem Beispiel gemischten Inhalt haben, bestehend aus Text und einem möglichen Kindelement `link`. Bei der Konstruktion der HTML-Ausgabe wird daher zwischen `<body>...</body>` wieder nur das leere Element `<xsl:apply-templates />` notiert. Der HTML-Code für das mögliche Kindelement `link` wird in dem eigenen Template definiert, das mit `<xsl:template match="link">` beginnt.

Bei diesem Template können Sie erkennen, wie auf einzelne Attribute zugegriffen wird. Denn um aus `<link>http://www.w3.org/Style/XSL/</link>` eine anklickbare HTML-Ausgabe wie `<a href="http://www.w3.org/Style/XSL/">http://www.w3.org/Style/XSL/</a>` zu erzeugen, muss der Inhalt des `link`-Elements gleich zweimal ausgegeben werden: einmal als Wertzuweisung an das `href`-Attribut, und einmal als Inhalt des `a`-Elements.
Dazu notieren Sie beim HTML-Code, der erzeugt werden soll, erst einmal nur das einleitende Tag ohne Attribut, im Linkbeispiel also nur `<a>`. Anschließend notieren Sie `<xsl:attribute name="href">`. Der XSLT-Parser weiß dann, dass sich das so angesprochende `href`-Attribut auf das zuvor notierte HTML-Element bezieht. Der Inhalt zwischen diesem Einleitungs-Tag und seinem Gegenstück `</xsl:attribute>` ist der Wert, den Sie dem Attribut zuweisen möchten. Im obigen Beispiel soll das ja der Inhalt sein, der zwischen `<link>` und `</link>` steht. Dieser Inhalt lässt sich mit der bereits bekannten Anweisung `<xsl:value-of select="." />` referenzieren. So gelangt der Zeicheninhalt des XML-Elements in die Wertzuweisung an das HTML-Attribut.

Gleichzeitig soll der Inhalt von `<link>...</link>` aber in HTML auch als Inhalt von `<a...>...</a>` erscheinen. Also wird auch dafür noch einmal `<xsl:value-of select="." />` innerhalb des Templates für das `link`-Element notiert.

### Beachten Sie:

Bei Grafiken und Multimedia gehen Sie analog dazu vor. Angenommen in den XML-Daten steht:
`<bild>images/titel.gif</bild>`
Dann können Sie dies in XSL wie folgt in HTML übersetzen:
`<xsl:template match="bild">
<img><xsl:attribute name="src"><xsl:value-of select="." /></xsl:attribute></img>
</xsl:template>`

Wichtig: das `img`-Element in HTML sollten Sie in diesem Fall mit Anfangs- und End-Tag und nichts dazwischen notieren. Ansonsten produzieren die XSLT-Parser in der Regel Fehler.

## Viertes Beispiel: ein Glossar

Ein Glossar ist ein typisches Dokument mit einer einfachen, sich wiederholenden Struktur. Ein Glossar besteht aus Begriffen und zugehörigen Definitionen. Jeweils ein Begriff mit Definition stellt ein Glossareintrag dar. Bei der Transformation dieser XML-Daten nach HTML soll das Glossar als zweispaltige Tabelle formatiert werden. In der linken Spalte stehen die Begriffe, und in der rechten Spalte die zugehörigen Definitionen.

Anzeigebeispiel: So sieht's aus (Ergebnisdatei glossar.htm)
Anzeigebeispiel: So sieht's aus (Datei glossar.xml - XML/XSLT-fähiger Browser erforderlich)

### Beispiel-DTD glossar.dtd:

    <!ELEMENT glossar     (eintrag)*>
    <!ELEMENT eintrag     (begriff,definition)>
    <!ELEMENT begriff     (#PCDATA)>
    <!ELEMENT definition  (#PCDATA)>

### Beispiel einer gültigen Anwendung glossar.xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE glossar SYSTEM "glossar.dtd">
    <?xml-stylesheet type="text/xsl" href="glossar.xsl" ?>
    <glossar>
     <eintrag>
        <begriff>Avatar</begriff>
       <definition>
        Bezeichnet in der Mythologie einen Gott, der auf Erden wandelt.
        Im Online-Sprachgebrauch eine grafische Phantasiefigur, mit der
        ein Teilnehmer an Chats, Rollenspielen usw. teilnimmt.
        </definition>
     </eintrag>
     <eintrag>
        <begriff>Award</begriff>
       <definition>
        Im WWW eine Auszeichnung für besonders gut gemachte Web-Seiten.
        Eine Inflation von selbsternannten Award-Verleihern, deren Awards
        nur den Zweck haben, Besucher auf die eigenen Seiten zu locken,
        haben das Award-Wesen im Web jedoch stark beschädigt.
        </definition>
     </eintrag>
    </glossar>

### Beispiel der eingebundenen XSL-Datei glossar.xsl:

    <?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>
     <head>
     </head>
     <body>
     <table border="1">
     <tr>
      <td><b>Begriff</b></td>
      <td><b>Definition</b></td>
     </tr>
     <xsl:for-each select="glossar/eintrag">
     <tr>
      <td valign="top"><xsl:value-of select="begriff" /></td>
      <td valign="top"><xsl:value-of select="definition" /></td>
     </tr>
     </xsl:for-each>
     </table>
     </body>
     </html>
     </xsl:template>

    </xsl:stylesheet>

### Erläuterung:

Das Beispiel definiert in der DTD glossar.dtd die gewünschten Elemente. In der Anwendungsdatei glossar.xml sehen Sie ein Beispiel, wie diese Definitionen korrekt umgesetzt werden. Einzelheiten zu solchen Elementdefinitionen in DTDs finden Sie im Abschnitt Elemente (Tags) und Verschachtelungsregeln.

Genau wie im Gruß-Beispiel wird in der XML-Datei wieder die XSL-Datei mit den Angaben zur Transformation nach HTML eingebunden. Die XSL-Datei - hier mit Namen glossar.xsl - hat auch wieder das typische Grundgerüst.

Da das Glossar einen starren Aufbau hat, bestehend aus festem Elementinhalt mit fester Reihenfolge, ist es möglich, die gesamte gewünschte HTML-Ausgabe ähnlich wie im Gruß-Beispiel mit einem einzigen `xsl:template`-Element zu erzeugen. Ein wichtiger Unterschied zum Gruß-Beispiel besteht jedoch: während der Gruß in der XML-Datei nur einmal notiert werden durfte, kann das Glossar entsprechend der DTD-Definitionen aus beliebig vielen Glossareinträgen bestehen. Diese sind allerdings einheitlich aufgebaut.

Für solche Fälle gibt es die Schleifenanweisung `xsl:for-each` (engl. for-each = dt. für jedes einzelne). Sie kommt im obigen Beispiel dort zum Einsatz, wo sie im HTML-Code einen Wiederholungs-Effekt erzeugen soll. Die Daten des Glossars sollen ja als HTML-Tabelle ausgegeben werden, also wird mit `<table...>...</table>` eine entsprechende Tabelle erzeugt. Innerhalb der Schleife, die mit `<xsl:for-each select="glossar/eintrag">` eingeleitet wird, wird eine Tabellenzeile konstruiert. Das führt dazu, dass beim Erzeugen der HTML-Ausgabe so viele Tabellenzeilen erzeugt werden, wie das Glossar Einträge hat. Innerhalb der Schleife wird als Inhalt von `<tr>...</tr>` mit der bereits bekannten Anweisung `value-of` auf den durch die Schleife jeweils aktuellen Inhalt der Elemente `begriff` und `definition` Bezug genommen.

Neu an dem Glossarbeispiel ist ferner die Adressierung `select="glossar/eintrag"` beim `xsl:for-each`-Element. Dort muss der gesamte Pfadname des Elements angegeben werden, bei dem die Schleife wiederholt werden soll. Der Pfadname beginnt beim Dokument-Element, also `glossar`. Gewünscht ist das Element `eintrag`, das ein Kindelement von `glossar` ist. Solche Hierarchien werden genauso notiert wie Verzeichnisnamen in URIs, also getrennt durch Schrägstriche. Die Regeln für solche Pfadangaben werden durch die Sprache XPath geregelt.

| XSLT-Elemente
| Grundlagen von XSL/XSLT

© 2007 Impressum