Webseiten-Erstellung mit XSLT...

Zurück Inhalt Weiter

Dieser Artikel zeigt einen Weg zur Erstellung von Webseiten, insbesondere vieler Seiten größerer Sites mit einheitlicher CI, mit Hilfe der Programmiersprache XSLT - Extensible Stylesheet Language Transformations.


Was ist XSLT?

XSLT ist eine deklarative, funktional-applikative Programmiersprache in XML-Syntax. Im Gegensatz zu den meisten auf XML-Syntax basierenden Computersprachen wie XHTML, SVG, SMIL, DocBook, MathML etc. ist XSLT dabei wirklich eine Programmiersprache, besitzt es doch alles notwendige zur Formulierung von Algorithmen: Funktionsdeklarationen, genannt Templates, Parameter bzw. Argumente, Bedingungen, Schleifen und Variablen.


MOM und POP

XSLT dient dazu, sogenannte Transformationen zu programmieren. Ausgangslage ist XML. Nur weil zwei Systeme XML verstehen, heisst das noch lange nicht, dass sie miteinander kommunizieren können. Vergleicht man einfach die Dokumentsprache bzw. das Dateiformat mit Sprache, ergibt sich folgende Analogie. GIF, JPEG, MS-Word sind die Sprachen von Katzen, Hunden und Elefanten. XML ist wie menschliche Sprache: es gibt Konsonanten, Vokale etc..
XML definiert aber nicht den Wortschatz und die Struktur einer Sprache, ebensowenig die Semantik (Bedeutung). Das alles geschieht erst durch einen bestimmten Dokumenttyp wie z.B. XHTML ("Englisch"), SVG ("Französisch") etc..

Eine Transformation ist eine Übersetzung von einem XML-Dokumenttyp, z.B. DocBook, in einen anderen Dokumenttyp, z.B. XHTML. Das Format des Zieldokumentes ist dabei üblicherweise ebenfalls XML-basiert, aber auch andere Ausgabeformate sind möglich und mit PNG, LaTeX, RTF oder PDF sogar sehr gebräuchlich.


MOM und POP

Die beiden Hauptanwendungsgebiete von Transformationen sind Message Oriented Middleware (MOM) und Presentation Oriented Publishing (POP). MOM bedeutet, die Transformation zwischen zwei Systemen einzusetzen, welche Daten austauschen, z.B. zwischen den Warenwirtschaftssystemen eines Getränke-Großhandels und eines Getränke-Einzelhandels. POP bedeutet, die Transformation einzusetzen, um Daten in verschiedenen Ausgabeformaten zu präsentieren, z.B. HTML, PDF und SVG.


XSLT als Bestandteil von XSL

Ursprünglich war XSLT nur als Bestandteil der Sprache XSL gedacht. XSL besteht aus drei Teilen: XPath zur Adressierung von strukturellen Bestandteilen eines XML-Dokuments (sogenannte Nodes im XML-Document-Tree), XSLT Transformation und Formatting Objects zur formatierten Ausgabe. Die Formatting Objects lassen sich aber problemlos durch fast jedes andere Ausgabeformat, in jedem Fall durch jedes XML-basierte und fast jedes Text-basierte Ausgabeformat ersetzen.


XPath

XPath ist eine Sprache zur Beschreibung von Pfaden zur Adressierung von Nodes in XML-Dokumenten. XPath bildet nicht nur die Grundlage für die XSLT Patterns, sondern auch für XPointer und damit XLink.


Ein kleines aber knackiges Beispiel

Es wäre doch schön, wenn Hyperreferences aus einem HTML-Dokument ("Links") sagen würden, in welcher Sprache das Zieldokument ist, wenn es in einer anderen Sprache als die des Quelldokuments geschrieben wurde.
HTML sieht für die Angabe von Sprachen für ein Dokument zwei Möglichkeiten vor. Das html-Element soll ein xml:lang-Attribut mit dem Sprachkürzel tragen, ältere HTML-Versionen verwenden dafür ein lang-Attribut. Eine zusätzliche Möglichkeit ist die Angabe eines hreflang-Attributs beim Quellanker (a-Element) zur Angabe der Sprache des Zieldokuments.

In das Dokument soll im Link ein Bild eingefügt werden, das über die Sprache des referenzierten Dokuments Auskunft gibt, sofern das Zieldokument in einer anderen Sprache ist. Außerdem soll das alt-Attribut des Bildes in Klammern die Sprache angeben, und zwar einmal in der Sprache des Quelldokuments und einmal in der Sprache des Zieldokuments. Ansonsten soll das Dokument nicht verändert werden (aus XML-Sicht).


Vorbereitung

Wir brauchen ein Zieldokument, das vernünftig über das xml:lang-Attribut verfügt. Außerdem brauchen wir zwei Quelldokumente, eines ohne hreflang-Attribut zum Testen des Auslesens von xml:lang im Zieldokument und eines mit hreflang-Attribut für Zieldokumente ohne xml:lang-Attribut. Diese Dokumente sind Listings 1, 2 und 3.

Außerdem brauchen wir natürlich die Texte für die Sprachen. Damit man sie möglichst gut wiederverwenden kann, legen wir sie in einem separaten Dokument ab. In diesem Dokument stehen die Sprachen mit ihren Namen in allen verwendeten Sprachen und dazu ein Verweis auf das Bild. Dieses Dokument ist Listing 4.


Vorgehensweise

Zuerst wird das Grundgerüst des Stylesheets entwickelt. Anschließend wird eine Template entwickelt, die einfach nur kopiert. Das ist eine Template, die auf alles wesentliche passt, also Elemente (*), Attribute (@*), Kommentare (comment()) und Processing-Instructions (processing-instruction()). Sie kopiert die aktuelle Node und ruft die Templates für die Attribute und den Rest auf. Das ist im Falle unseres Stylesheets immer rekursiv diese Template mit Ausnahme für <a>-Elemente.

Und nun kommt die Template für <a>-Elemente. Natürlich wird zuerst der Anker kopiert, mitsamt Attributen und Inhalt. Anschließend wird eine Variable mit Namen lc angelegt. Sie wird den Sprachcode für das Zieldokument enthalten. Für die Variable wird geprüft, ob die Sprache des Zieldokuments beim Anker steht (hreflang-Attribut) oder im Zieldokument zu finden ist (xml:lang-Attribut oder lang-Attribut am html-Element des Zieldokuments). Wird keine Sprache gefunden, bleibt die Variable leer.

Anschließend wird geprüft, ob die Zielsprache gefunden wurde und unterschiedlich ist als die Sprache des Quelldokuments. Falls ja, wird, mit einem Leerzeichen getrennt, das Bild mit der in Listing 4 angegebenen Quelle eingefügt. Zusätzlich erhält das Bild ein alt-Attribut mit den Namen der Sprache in der Quell- und in der Zielsprache in Klammern.


Was ist sonst noch möglich?

Mit XSLT lassen sich viele Aufgaben für Webseiten realisieren. Das Einfügen einer Grafik, welche die Sprache angibt, ist nur ein kleines Beispiel. Hier ein paar weitere praktische Anwendungen:




Christian Wolfgang Hujer ist geschäftsführender Gesellschafter der ITCQIS GmbH und entwickelt Schulungskonzepte für Enterprise-Trainings zu New Technologies Themen wie XML, Java, EJB, Application Server, Unix und Security.

Listing 1: Quelldokument Variante 1

<html xml:lang="de">
<head>
<title>Ein deutsches Dokument</title>
</head>
<body>
<h1>Ein deutsches Dokument</h1>
<p>Ein anderes <a href="dest.html">Dokument</a></p>
</body>
</html>


Listing 2: Quelldokument Variante 2

<html xml:lang="de">
<head>
<title>Ein deutsches Dokument</title>
</head>
<body>
<h1>Ein deutsches Dokument</h1>
<p>Ein anderes <a href="dest.html"
hreflang="en">Dokument</a></p>
</body>
</html>


Listing 3: Zieldokument

<html xml:lang="en">
<head>
<title>An English document</title>
</head>
<body>
<h1>An English document</h1>
<p>This document is written in English</p>
</body>
</html>


Listing 4: Die Sprachbeschreibungen

<languages>
<language code="de">
<name xml:lang="de">Deutsch</name>
<name xml:lang="en">German</name>
<name xml:lang="pl">Niemiecki</name>
<img src="/gfx/de.gif" / >
</language>
<language code="en">
<name xml:lang="de">Englisch</name>
<name xml:lang="en">English</name>
<name xml:lang="pl">Angielski</name>
<img src="/gfx/en.gif" />
</language>
<language code="pl">
<name xml:lang="de">Polnisch</name>
<name xml:lang="en">Polish</name>
<name xml:lang="pl">Polski</name>
<img src="/gfx/pl.gif" />
</language>
</languages>


Listing 5: Die Transformation

<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
>
<xsl:output
method="xml"
/>

<!-- Anker -->
<xsl:template match="a">
<!-- kopieren -->
<xsl:copy >
<!-- Inhalt kopieren -->
<xsl:apply-templates select="@*|node()"/>
<!-- Ist es ein Quellanker? -->
<xsl:if test="@href"><!-- Quellanker -->
<!-- Zielsprache feststellen und in $lc
speichern -- >
<xsl:variable name="lc">
<xsl:choose>
<xsl:when test="@hreflang">
<xsl:value-of
select="@hreflang"/>
</xsl:when>
<xsl:when
test="document(@href)/html/@xml:lang" >
<xsl:value-of
select="document(@href)/html/@xml:lang"/ >
</xsl:when>
<xsl:when
test="document(@href)/html/@lang">
<xsl:value-of
select="document(@href)/html/@lang"/ >
</xsl:when>
</xsl:choose>
</xsl:variable>
<!-- Konnte die Zielsprache ermittelt werden
und ist sie unterschiedlich als die Quellsprache? -->
<xsl:if test="$lc and
($lc!=/html/@xml:lang)">
<!-- Leerzeichen einfügen -->
<xsl:text> </xsl:text>
<!-- Bild einfügen -- >
<img>
<xsl:copy-of
select="document('languages.xml')//language[@code=$lc]/img/@src"/ >
<!-- Passenden Text im
alt-Attribut einfügen -->
<xsl:attribute name="alt">

<xsl:text>(</xsl:text >
<xsl:value-of
select="document('languages.xml')//language[@code=$lc]/name[@xml:lang=current()/ancestor-or-self::*[@xml:lang]/@xml:lang]/text()"/ >

<xsl:text>/</xsl:text>
<xsl:value-of
select="document('languages.xml')//language[@code=$lc]/name[@xml:lang=$lc]/text()"/ >

<xsl:text>)</xsl:text>
</xsl:attribute>
</img>
</xsl:if>
</xsl:if><!-- Quellanker -->
</xsl:copy>
</xsl:template>

<!-- Die Kopier-Template für den Rest -->
<xsl:template match="*|@*|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:transform>

Zurück Inhalt Weiter