Mutabor

Damit XML-Dokumente oder -Daten dem Anwender im Browser, auf dem Handy oder als PDF ansprechend "begegnen" können, ist es erforderlich, die Originaldaten in die dafür notwendigen Formate zu wandeln. Als Teil der Stilkomponente von XML dient XSLT genau diesem Zweck.

In Pocket speichern vorlesen Druckansicht 26 Kommentare lesen
Lesezeit: 20 Min.
Von
  • Henning Behme
Inhaltsverzeichnis

Im November vorigen Jahres hat das World Wide Web Consortium (W3C) die XSL-Transformationen, kurz XSLT, als Empfehlung herausgegeben - eine Art W3C-Standard. Diese in XML entworfene Sprache soll es Webmastern und -programmiererinnen ermöglichen, aus beliebig strukturierten XML-Daten etwas zu generieren, das der Webserver entweder als HTML-Seite, PDF-Dokument oder XML an die Anwender ausliefern kann.

Grundsätzlich bedeutet die Verarbeitung von XML-Quellen mit einem XSLT-Programm, dass dies aus der Quelle einen Dokumentenbaum aufbaut und durch Abarbeiten der Vorgaben des Stylesheet in einen Zielbaum wandelt.

Mehr Infos

Im Umfeld von XSLT hat das Konsortium, ebenfalls im November 1999, eine Sprache für den Zugriff auf Teile eines Dokuments verabschiedet, die sowohl für XSLT als auch XPointer (einen Teil der noch nicht endgültig vorliegenden Spezifikationen zum Linking) gedacht ist. Diese XML Path Language (XPath) beschreibt in ‘Ausdrücken’ (expressions), welche Elemente und Attribute für die Verarbeitung auszuwählen sind.

Zu XSLT hat iX schon Artikel veröffentlicht, sei es generell oder spezifisch (siehe die Artikel [3] bis [6]). Hier soll im Unterschied zu den bisherigen der Einstieg und Umgang mit XSLT und XPath im Vordergrund stehen, wobei die Beispiele von Mal zu Mal komplexer sein werden. In diesem ersten Teil wird es um Grundsätzliches sowie zwei einfache Konvertierungsbeispiele gehen. Wie die Fortsetzung aussieht, ist - grob - dem Kasten ‘Vorgehensweise’ zu entnehmen.

XML-Dokumente und -Daten können in fast beliebiger Struktur vorliegen. Jede/r kann sich eigene Dokumenttypen definieren und sie in einer so genannten DTD (Dokumenttypdefinition) beschreiben. Damit können Browser zumindest noch nichts anfangen, ohne dass man ihnen entweder eine in HTML gewandelte Version, ein PDF-Dokument oder eins in XML samt einer Referenz auf ein XSLT-Stylesheet schickt (Letzteres nur IE 5.x).

Ein schlichtes Beispiel soll zunächst zeigen, was an HTML-Code XSLT-Prozessoren aus einer XML-Quelle erzeugen. Zugrunde liegt das Dokument, das Listing 1 zeigt. Ein Brief, der aus den Elementen brief sowie darin enthalten einer anrede, einem text und einem gruss besteht. Diesen Text kann ein HTML-Browser nicht darstellen, weil er die Elemente des Dokuments nicht kennt. Für die Wandlung in HTML benötigt man einen XSLT-Prozessor, der anhand eines XSLT-Stylesheet die Elemente in HTML überführt.

Mehr Infos

LISTING 1: brief.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 

<!DOCTYPE brief SYSTEM "brief.dtd">

<brief>

<anrede geschlecht="f" sozial="du">Nora</anrede>

<text>habe gerade den Ulysses beendet. Mal sehen, wann
der in den USA gedruckt werden darf...</text>

<gruss>J</gruss>

</brief>

Listing 2 enthält das Stylesheet, Listing 3 den resultierenden HTML-Text. Der Aufruf eines XSLT-Prozessors bewirkt, dass dieser eine Baumstruktur des XML-Dokuments aufbaut, das Stylesheet einliest und aus dem Quellbaum einen Zielbaum (in diesem Fall HTML) erzeugt, der den Angaben des Stylesheet entspricht.

Mehr Infos

LISTING 2: brief.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">

<xsl:output method="html"/>

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

</xsl:template>

<xsl:template match="anrede">
<p>
<xsl:choose>
<xsl:when test="@sozial='du'">
<xsl:text>Liebe</xsl:text>
<xsl:if test="@geschlecht='m'">
<xsl:text>r</xsl:text>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:when>

<xsl:when test="@sozial='sie'">
<xsl:choose>
<xsl:when test="@geschlecht='m'">
<xsl:text>Sehr geehrter Herr </xsl:text>
</xsl:when>
<xsl:when test="@geschlecht='f'">
<xsl:text>Sehr geehrte Frau </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:when>
</xsl:choose>

<xsl:apply-templates/>
<xsl:text>,</xsl:text>
</p>
</xsl:template>

<xsl:template match="text | gruss">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>

</xsl:stylesheet>
Mehr Infos

LISTING 3: brief.html

<html xmlns="http://www.w3.org/TR/REC-html40">
<body>
<p>Liebe Nora,</p>

<p>habe gerade den Ulysses beendet. Mal sehen, wann
der in den USA gedruckt werden darf...
</p>

<p>J</p>
</body>
</html>

Für den vorliegenden Fall bedeutet das: Zunächst liest der ‘Prozessor’ die Datei brief.xml, anschließend brief.xsl. Schließlich generiert er den Zielbaum in HTML, den der Anwender in eine Datei leiten kann/muss. Die Vorgehensweise ist top-down: Der Prozessor bearbeitet das Stylesheet hierarchisch, sucht nach einem passenden Ausdruck, mit dem er beginnen kann.

Die am Anfang von Listing 2 stehenden Zeilen sollen hier noch nicht interessieren, sie müssen aber unbedingt so im Stylesheet stehen. Für die eigentliche Bearbeitung sind xsl:templates die Basis. Hier ist der erste Ausdruck, auf den der Prozessor stößt, <xsl:template match="/brief">, dessen Bearbeitung heißt, einen hier sehr mageren HTML-Rahmen (<html><body>...</body></html>) zu erzeugen und innerhalb dieses Rahmens die Kindelemente zu verarbeiten, sofern für sie Templates vorliegen. Das ist hier der Fall, denn sowohl für anrede als auch text und gruss sind sie vorhanden.

Für text und gruss sieht das gemeinsame Template vor, dass ein Absatz (p) den Inhalt des Elements enthalten soll. Die Pipe im Attribut match bedeutet ein Oder, und xsl:apply-templates bewirkt eine tiefere hierarchische Verzweigung zu den Kindelementen.

Komplizierter sieht das Template für die Anrede aus, weil das Element zwei Attribute enthält, die das Geschlecht und die soziale Verbindung beschreiben. Deswegen enthält das Template zwei Abfragen. Unverständlicherweise kennt das xsl:if der Spezifikation kein else, sodass es nötig ist, mit xsl:choose zu arbeiten, das der case-Abfrage in anderen Programmiersprachen entspricht (außer xsl:when kann es auch ein xsl:otherwise enthalten).

Im Klartext bedeutet die Schachtelung von xsl:choose und xsl:if: wenn wir beim Du sind, schreibe einen Absatz mit dem Inhalt ‘Liebe/r +*Namen + Komma’, je nach dem Geschlecht. Sind wir per Sie, schreibe abhängig vom Geschlecht den Vorsatz und anschließend den Namen samt Komma.

Nun ein Wort zu dem bisher vernachlässigten Rahmen des Stylesheet. Beim Entwurf von XSLT war es offenkundig für die Mehrheit (oder die Mächtigen) im W3C von besonderer Bedeutung, dass XSLT-Stylesheets XML-Dokumente sind. Listing 4 enthält neben der XML-Deklaration (Zeile 1) unbedingt nötige Formalien wie das Element xsl:stylesheet, das die für die Verarbeitung sorgenden weiteren Elemente beinhaltet; die fehlen hier allerdings. Und statt xsl:stylesheet darf ein XSLT-Dokument auch xsl:transform beinhalten, das dieselbe Funktion hat.

Mehr Infos

LISTING 4: Zwingender XSLT-Rahmen

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">

<!-- Code für die Transformationen -->

</xsl:stylesheet>

In beiden Fällen unabdingbar sind die Attribute version und xmlns:xsl, die a) festlegen, um welche XSLT-Version es sich handelt und b) wie das Namensraumspräfix heißen soll. Theoretisch könnte dort statt xsl eine andere Zeichenkette stehen, aber wer will sich darauf verlassen, dass XSLT-Prozessoren derlei Benennung nicht einkompiliert haben. Der String xsl ist in dieser Hinsicht eine Art ‘Industriestandard’. Hintergrund der Namensraumzuweisung ist, dass auf diese Weise mehrere Dokumentarten innerhalb eines Stylesheet verwendbar sind und vor allem, dass man Elemente eindeutig kennzeichnen kann. Der Unterschied zwischen den beiden folgenden gleichnamigen Elementen dürfte einleuchten:

<buch:titel>Neulich im Internet</buch:titel>   
<person:titel>Prof. Dr.</person:titel>

Der URI, der den Namensraum bezeichnet, ist eine Konvention, hinter der nichts steht, außer dass er so und nicht anders heißen muss. Keine Webadresse, kein Link.

Eingerahmt vom Element xsl:stylesheet können die Elemente stehen, die die XSLT-Spezifikation als Top-Level-Elemente bezeichnet - obwohl sie unterhalb des gerade genannten zu finden sind. Die nebenstehende Tabelle listet diejenigen auf, die diesen Vermerk in Abschnitt ‘Element Syntax Summary’ der Spezifikation tragen. Nicht als Top-Level-Element gilt das dem xsl:include ähnliche xsl:import, weil es nicht an beliebiger Stelle dieser Hierarchie stehen darf, sondern als erstes (auch vor xsl:include) anzugeben ist.

Dass sowohl xsl:include als auch xsl:import vorgesehen sind, suggeriert einen Unterschied. Der existiert tatsächlich, denn im Falle von xsl:import überschreibt das importierende Stylesheet das eingebundene im Konfliktfall, wohingegen xsl:include eine Kopie bewirkt. Ergibt dies einen Konflikt, kann der XSLT-Prozessor einen Fehler melden - oder das letzte von mehreren gleichen Templates verarbeiten.

Gleiche Templates heißt in diesem Zusammenhang, dass die XPath-Ausdrücke im Attribut match des Elements xsl:template identisch sind (siehe unten). Davor möge man sich also hüten.

xsl:import und xsl:include ermöglichen es, Stylesheets modular aufzubauen, was mehr Übersichtlichkeit bringt. Außerdem kann man in wenigen Punkten abweichende Stylesheets durch ein Überschreiben vorhandener erreichen.

Die eigentliche Verarbeitung des XML-Dokuments bewirken die xsl:template-Elemente innerhalb des Rahmens, den Listing 4 zeigt. Im einfachsten Fall sorgt ein xsl:template dafür, dass die unterhalb eines Knotens (Elements) sich befindenden Elemente wiederum zur Verarbeitung anstehen (siehe Listing 2). In obigem Beispiel hieße das, zunächst das Element brief und, daraus verzweigend, die Elemente anrede, text und gruss zu verarbeiten.

XSLT: Rahmen- und Top-Level-Elemente
Name Attribut(e) Inhalt
stylesheet id, extension-element-prefixes, exclude-result-prefixes, version import, Top-Level-Elemente
transform id, extension-element-prefixes, exclude-result-prefixes, version import, Top-Level-Elemente
import href -
attribute-set name, use-attribute-sets attribute
decimal-format name, decimal-separator, grouping separator, infinity, minus-sign, NaN, percent, per-mille, zero-digi, digit, pattern-separator -
include href -
key name, match, use -
namespace-alias stylesheet-prefix, result-prefix -
output method, version, encoding, omit-xml-declaration, standalone doc-type-public, doctype-system, cdata-section-elements, indent, media-type -
param name, select template
preserve-space elements -
strip-space elements -
template match, name, priority, mode (param, template)
variable name, select template
Die beiden erstgenannten Elemente (stylesheet und transform) sind Synonyme; und import muss jeweils vor den folgenden Top-Level-Elementen stehen. Allen Elementen in diesem Kasten ist das korrekte Namensraum-Präfix voranzustellen - im Falle von xsl als Präfix: xsl:import.

Für die ‘Adressierung’ von Elementen, Attributen et cetera stellt XPath die so genannten Expressions zur Verfügung, innerhalb derer man sowohl mit Prädikaten (durch eckige Klammern gekennzeichnet) für Elemente als auch (darin) mit Funktionen arbeiten kann. Ausgehen von der Wurzel des Elements (/) können Ausdrücke ins Dokument navigieren. /dictionary bezeichnet beispielsweise das eine sich direkt unter der Wurzel befindende Element, //entry findet jedes Element entry an beliebiger Stelle im Dokument.

Auf unterschiedlichen Achsen kann man im Dokument navigieren (siehe unten). Weitverbreitetes Beispiel ist es, nach der Position im Dokument zu fragen.

<xsl:template macht="//entry[not(position()=last())]">  

sucht nach entrys irgendwo im Dokument, die nicht das letzte ihrer Art sind. Aber Zugriffe können auch . und .. enthalten, die den gegenwärtigen Knoten oder dessen Elternteil bedeuten. Ein Ausdruck wie ../@id etwa bezieht sich auf das Attribut des Elternelements, und entry[@id=’dtd’] trifft auf einen bestimmten Eintrag, den mit der ID dtd zu.

Im weiteren Verlauf dieses Artikel, der mehr solcher Ausdrücke nutzt, dient als Bezug ein kleines Wörterbuch, dessen Struktur durch seine Übersichtlichkeit geeignet ist, unterschiedliche Zugriffe auf den Dokumentbaum und das Generieren verschiedengearteter Zielbäume darzustellen. Listing 5 zeigt die einfachste Variante der Struktur: das Wörterbuch (dictionary) enthält Einträge (entry), die ihrerseits aus einem möglichen Akronym (acro) sowie aus dem ausgeschriebenen Begriff (term) und mindestens einer Erklärung (expl) bestehen - vorgesehen sind Erläuterungen in deutscher und englischer Sprache.

Mehr Infos

LISTING 5: Wörterbuch-DTD

<!ELEMENT dictionary ( entry+ ) >

<!ELEMENT entry ( acro?, term, expl+ ) >

<!ELEMENT acro ( #PCDATA ) >
<!ELEMENT term ( #PCDATA ) >
<!ELEMENT expl ( #PCDATA | p | ref )* >
<!ELEMENT p ( #PCDATA | ref )* >
<!ELEMENT ref ( #PCDATA ) >
<!ATTLIST expl
lang (de|en) "de" >

<!ATTLIST entry
id ID #REQUIRED >

<!ATTLIST ref
idref IDREF #REQUIRED >

Erforderlich sind Templates für das Inhaltsvereichnis sowie solche, die die Details der einzelnen Einträge betreffen. Umständlich ausgedrückt hieße das, ein Template für jede Hierarchiestufe des Dokumentenbaums zu erstellen und sich so ‘von Ast zu Ast’ zu hangeln, wie Listing 6 suggeriert: Das Dokumentenelement dictionary verzweigt in das ‘darunter’ liegende entry und so weiter. Das ist jedoch nicht erforderlich, denn man kann auf unterschiedliche Weise Elementarten ansprechen (auch dieselben mehrmals und unterschiedlich).

Mehr Infos

LISTING 6: Templates

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

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

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

Außerdem kommen in diesen Stylesheets ein paar der wichtigen Aspekte der XSLT-Programmierung zum Tragen: zunächst die Modularisierung, das heißt praktisch die Aufteilung in mehrere Dateien, die jeweils das Benötigte für das Inhaltsverzeichnis und die Einzeldaten beinhalten. So sollen drei Stylesheets vorhanden sein:

  • toc.xsl: Inhaltsverzeichnis,
  • entry.xsl: Einzeleinträge,
  • dictionary.xsl: zentrales Stylesheet (Mantel).

Alle drei sind selbst vollständige Stylesheets (wenn auch nicht für sich allein benutzbar, weil sie Module sind) - und XML-Dokumente. Um bei den beiden ersten anzufangen: toc.xsl (Listing 7) enthält den Zugriff auf das oberste Element des Quellbaums: match="dictionary". Schon ‘vorher’ bedeuten die Zeilen

xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon"

im Element xsl:stylesheet den Abschied aus dem Reich der XSLT-Spezifikation, denn sie besagen, dass Michael Kays Software Saxon als XSLT-Prozessor dient. Die erste Zeile benennt den Namensraum für saxon, die zweite bedeutet, dass saxon das Vorzeichen für Erweiterungen des XSLT-Standards ist.

Mehr Infos

LISTING 7: toc.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">

<!-- ............list of entries.................. -->
<xsl:template match="dictionary">
<saxon:output method="html"
file="{$dir}{$filesep}index.html"
doctype-public="-//W3C//DTD HTML 4.0 Transitional"
doctype-system="http://www.w3.org/TR/REC-html40"
encoding="iso-8859-1"
indent="yes">

<html>
<head>
<meta name="author" content="Henning Behme" />
<meta name="keywords" content="iX Web dictionary iX-Woerterbuch" />
<title>iX Web dictionary</title>
<link rel="stylesheet" href="dictionary.css" type="text/css"/>
</head>

<body>
<table border="0" width="100%" cellspacing="0" cellpadding="5">
<tr>
<td rowspan="4" valign="top" width="30%">
<img src="/ix/images/iX.mini.tr.gif" alt="iX logo"/>
</td>
<td>
<h1>Web Dictionary</h1>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="200" height="50"/>
</td>
</tr>
<tr>
<td>
<h2>Inhalt / ToC</h2>
<p>
<xsl:text>(</xsl:text>
<!-- urspuengliche unelegante Loesung:

<xsl:apply-templates select="//entry" mode="do-amount"/>

mit untenstehender Loesung ist ein do-amount ueberfluessig,
dass heisst: div.xsl ist dann nicht mehr notwendig ...
-->
<!-- elegantere Loesung; von Nicolas Kessler (16.1.2001) -->
<xsl:value-of select="count(//entry)"/>
<xsl:text> Begriffe/terms)</xsl:text>
</p>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="200" height="20"/>
</td>
</tr>

<tr>
<td>
<ul>
<xsl:for-each select="entry">
<xsl:sort select="acro"/>
<xsl:apply-templates select="acro" mode="toc"/>
</xsl:for-each>
</ul>
</td>
</tr>

<xsl:call-template name="do-foot"/>
</table>
</body>
</html>
</saxon:output>
<xsl:message> - index: done</xsl:message>
</xsl:template>

<xsl:template match="acro" mode="toc">
<li>
<a>
<xsl:attribute name="href">
<xsl:value-of select="../@id"/>
<xsl:text>.html</xsl:text>
</xsl:attribute>
<xsl:value-of select="."/>
</a>
</li>
</xsl:template>

<xsl:template match="entry" mode="do-amount">
<xsl:if test="position()=last()">
<xsl:value-of select="position()"/>
</xsl:if>
</xsl:template>

</xsl:stylesheet>

Und das hat seinen Grund, denn Saxon wie auch andere Prozessoren haben mehr implementiert, als die Spezifikation vorsieht. Kay hat beispielsweise das Element output um das Attribut file erweitert, weswegen innerhalb des Wörterbuch-Templates statt xsl:output das erweiterte saxon:output zu finden ist. Das file-Attribut ermöglicht es, innerhalb eines Template festzulegen, wie das resultierende Ergebnis heißt.

Da der HTML-Namensraum ohne Präfix notiert werden soll, taucht er im Element xsl:stylesheet ohne ein solches auf: xmlns="http://www.w3.org/TR/REC-html40".

Innerhalb des saxon:output-Start-Tags erzeugen zwei Variable den Pfad der Ergebnisdatei($dir und $filesep). Sie sind in toc.xsl nicht deklariert, weil das in dem oben genannten Rahmen-Stylesheet für alle einzubeziehenden geschieht (siehe unten). $dir bezeichnet das Verzeichnis, in dem das Resultat der Wandlung landet. $filesep ergibt betriebssystemunabhängig das Trennzeichen zwischen Verzeichnissen (und Dateien). Variablen lassen sich innerhalb von XPath-Ausdrücken verwenden; normalerweise ohne geschweifte Klammern, hier sind sie wegen der Abgrenzung notwendig.

Abgesehen vom Aufbau der eigentlichen HTML-Seite sind ein paar Bereiche des Stylesheet von besonderem Interesse (farblich hervorgehoben). Das Element xsl:text sollten Entwickler immer dann nutzen, wenn es darum geht, Zeichenketten, vor allem Leerzeichen, genau wie geplant auszugeben. Sowohl der XSLT-Prozessor als auch der HTML-Viewer behandeln Leerraum (Whitespace) so, dass von mehreren aufeinander folgenden Zeichen wie Tabulatoren, Leerzeichen et cetera ein einziges Leerzeichen übrig bleibt.

Der zweite farblich hervorgehobene Bereich zeigt den Umgang mit einer der Programmierern bekannten Kontrollstrukturen, von denen die if- sowie die case-Abfrage und das for-each es in die Spezifikation geschafft haben (Saxon beinhaltet zusätzlich ein while). Da xsl:if kein xsl:else kennt, muss schon eine Alternative mittels xsl:choose und darin enthaltenen xsl:when sowie xsl:otherwise realisiert werden.

Über das Attribut select iteriert for-each durch eine Menge von Einträgen und sortiert sie zunächst nach dem Wert des dort vorhandenen Elements acro. xsl:sort ist ein leeres Element, das den Sortierschlüssel als Wert des Attributs select enthält. Das Element steht innerhalb von xsl:apply-templates oder wie hier einer xsl:for-each-Schleife.

Für das Inhaltsverzeichnis sind nur die Akronyme auszugeben - jeweils als Link auf die Seite mit dem Eintrag (Abb. 1).

Anschließend verarbeitet das Stylesheet das darin in einem Ausdruck ‘angesprochene’ Template für das Element acro, allerdings in einem bestimmten Modus. Abbildung 1 zeigt das Ergebnis von Listing 7.

Ähnlich der SGML-Stilsprache DSSSL kennt XSLT die Möglichkeit, durch unterschiedliche mode=-Attributzuweisungen Elemente je nach Kontext anders zu verarbeiten. In diesem Fall soll im Inhaltsverzeichnis für acro jeweils ein <li> das Ergebnis sein, das wiederum einen Link (<a>) auf das in Bearbeitung befindliche Akronym enthält.

Zum Vergleich: innerhalb der jeweiligen Seite für den einzelnen Eintrag sieht das Akronym-Template (und das für den Begriff) stets anders aus, wie Listing 9 zu entnehmen ist. Das dort enthaltene Template für acro und term, das ohne Modus angesprochen wird, liefert nur den Wert des Textknotens. Die Pipe steht für ‘oder’.

Mehr Infos

LISTING 9: dictionary.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">

<xsl:variable name="dir">html</xsl:variable>
<xsl:variable name="filesep" select="system-property('file.separator')"/>

<xsl:include href="div.xsl"/>
<xsl:include href="entry.xsl"/>
<xsl:include href="toc.xsl"/>

<!-- ..............root template.................. -->
<xsl:template match="/">
<xsl:apply-templates select="dictionary"/>
<xsl:apply-templates select="dictionary/entry"/>
</xsl:template>

<!-- ..............acro + term.................. -->
<xsl:template match="acro | term">
<xsl:value-of select="."/>
</xsl:template>

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

<xsl:template match="ref">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@idref"/>
<xsl:text>.html</xsl:text>
</xsl:attribute>
<span class="acro">
<xsl:apply-templates/>
</span>
</a>
</xsl:template>

</xsl:stylesheet>

Das mit dem mode-Attribut versehene Template, das auf Akronyme passt, enthält in einer Kurzform den Zugriff auf ein Attribut des Elternelements id. Dies ist auf mehrerlei Wegen zu machen. Die folgenden vier Ausdrücke in einem select beschreiben dasselbe (die genannte id):

ancestor::entry/@id 
parent::node()/attribute::id
parent::node()/@id
../@id

In den drei ersten Zeilen geschieht der Zugriff über eine der so genannten XPath-Achsen, die der gleichnamige Kasten auflistet. Sie ermöglichen es, innerhalb von Dokumenten vorwärts und rückwärts zu manövrieren. ancestor greift auf die Vorfahren des gegenwärtigen Knotens zurück, parent auf den direkten Vorfahr, wobei die zweite Zeile mit attribute eine weitere Achse verwendet. Zur Vereinfachung dienen Kurzformen wie oben die vierte Zeile, die gleichbedeutend mit der zweiten und dritten ist. Die erste lautet zwar allgemeiner, führt aber zum selben Resultat.

XPath-Achsen
Achsenname Bedeutung
child Kindelemente
parent direkter Vorfahr
descendant(-or-self) Nachfahren (plus gegenwärtiger Knoten)
ancestor(-or-self) Vorfahren (plus gegenwärtiger Knoten)
following alle Knoten, die dem gegenwärtigen im Dokument folgen
preceding alle Knoten, die vor dem gegenwärtigen im Dokument stehen
following-sibling folgende Geschwister des gegenwärtigen Knotens
preceding-sibling vor dem gegenwärtigen Knoten stehende Geschwister
attribute Attribute eines Elements
namespace Namensraumknoten des gegenwärtigen Elements
self gegenwärtiger Knoten

Neben den Achsen sind es vor allem die Funktionen von XPath und XSLT, die die Programmierung von Web- und anderen Seiten erleichtern (siehe den Kasten ‘XPath-Funktionen’). Das letzte Template in Listing 7- xsl:template match="entry" mode="do-amount" - enthält zwei der Funktionen; es dient lediglich dazu, die Einträge auf eine andere Art als oben zu verarbeiten und mittels der Abfrage

test="position()=last()"  

nur für das letzte Element entry dessen Position auszugeben, die der Gesamtmenge an Einträgen entspricht. Dieser umständliche Weg ist notwendig, weil das für Nummerierungszwecke vorgesehene xsl:number hier nicht greift (es sind nicht die einzelnen Elemente durchzunummerieren).

XPath-Funktionen (Auswahl)
Name Rückgabewert
Node-Set-orientiert
last() Anzahl (von Elementen)
position() Kontextposition
count(node-set) Anzahl der Knoten in node-set
name(node-set?) erster Knotenname in node-set
(Elementname); Namensraumbezeichner, wenn vorhanden
Zeichenorientiert
concat(string, string, string*) Aneinanderreihung der Argumente
starts-with(string, string) wahr, wenn der erste string mit dem zweiten beginnt
contains(string, string) wahr, wenn der erste string den zweiten beinhaltet
substring(string, number, number?) Teil des string, beginnend mit dem Zeichen, das der 2. Parameter bezeichnet, endend mit dem, das der dritte bezeichnet
Boolean
not() wahr, wenn Argument unwahr
true()/false() wahr/unwahr

Einer der Nachteile der XSLT-Spezifikation (den das W3C erkannt und in die Anforderungen an die Version 1.1 der Spezifikation aufgenommen hat, siehe ‘Online-Ressourcen’) ist, dass man aus einem Quelldokument nicht beliebig viele Zieldokumente generieren kann. Wie oben erwähnt, kennen einige XSLT-Prozessoren das Attribut file für eine eigene Implementierung von output. Der Wert des Attributs lässt sich aus Variablen zusammensetzen, wie Listing 7 gleich zu Anfang zeigt.

file="{$dir}{$filesep}{$thisentry}.html"  

setzt voraus, dass die drei Variablen dir, filesep und thisentry deklariert sind. Für die beiden ersten erledigt das das Rahmen-Stylesheet dictionary.xsl. thisentry, nur wichtig für die Erstellung der Einzeleintragsdateien, ist deshalb am Anfang von entry.xsl (Listing 8) deklariert und bekommt innerhalb des Template für entry einen Wert, der zusammen mit den beiden anderen Variablen den Zielpfad vorgibt. Auf diese Weise lassen sich beliebig viele Dateien mit einem Template erzeugen, denn jeder Eintrag, den der Parser findet, bildet eine Ausgabedatei, weil nur innerhalb des Eintrags das saxon:output zum Tragen kommt.

Mehr Infos

LISTING 8: entry.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">

<xsl:variable name="thisentry"/>


<!-- .......template for dictionary's entry....... -->
<xsl:template match="entry">
<xsl:variable name="thisentry">
<xsl:value-of select="@id"/>
</xsl:variable>

<saxon:output method="html"
file="{$dir}{$filesep}{$thisentry}.html"
doctype-public="-//W3C//DTD HTML 4.0 Transitional"
doctype-system="http://www.w3.org/TR/REC-html40"
encoding="iso-8859-1"
indent="yes">

<html>
<head>
<title>iX Web dictionary</title>
<link rel="stylesheet" href="dictionary.css" type="text/css"/>
</head>

<body>
<table border="0" width="100%" cellspacing="0" cellpadding="5">
<tr>
<td rowspan="7" valign="top" width="30%">
<img src="/ix/images/iX.mini.tr.gif" alt="iX logo"/>
</td>
<td>
<h1>Web Dictionary</h1>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="200" height="50"/>
</td>
</tr>

<tr>
<td>
<h2><xsl:apply-templates select="acro"/></h2>
</td>
</tr>

<tr>
<td>
<h4><xsl:apply-templates select="term"/></h4>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="200" height="50"/>
</td>
</tr>

<tr>
<td>
<p class="de">
<xsl:apply-templates select="expl[@lang='de']"/>
</p>
</td>
</tr>

<tr>
<td>
<p class="en">
<xsl:apply-templates select="expl[@lang='en']"/>
</p>
</td>
</tr>

<tr>
<td>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="200" height="20"/>
<p class="navigate">
<xsl:if test="not(position()=1)">
<a>
<xsl:attribute name="class">navigate</xsl:attribute>
<xsl:attribute name="href">
<xsl:value-of select="preceding-sibling::entry[1]/@id"/>
<xsl:text>.html</xsl:text>
</xsl:attribute>
<xsl:value-of select="preceding-sibling::entry[1]/acro"/>
</a>
<xsl:text> </xsl:text>
<saxon:entity-ref name="lt"/>
<xsl:text> | </xsl:text>
</xsl:if>

<a>
<xsl:attribute name="class">navigate</xsl:attribute>
<xsl:attribute name="href">
<xsl:text>index.html</xsl:text>
</xsl:attribute>
<xsl:text>Inhalt/ToC</xsl:text>
</a>

<xsl:if test="not(position()=last())">
<xsl:text> | </xsl:text>
<saxon:entity-ref name="gt"/>
<xsl:text> </xsl:text>
<a>
<xsl:attribute name="class">navigate</xsl:attribute>
<xsl:attribute name="href">
<xsl:value-of select="following-sibling::entry/@id"/>
<xsl:text>.html</xsl:text>
</xsl:attribute>
<xsl:value-of select="following-sibling::entry/acro"/>
</a>
</xsl:if>
</p>
</td>
</tr>

<xsl:call-template name="do-foot"/>
</table>
</body>
</html>
</saxon:output>
<xsl:message> - <xsl:value-of select="$thisentry"/>: done</xsl:message>

</xsl:template>

</xsl:stylesheet>

Die dem End-Tag folgende xsl:message schreibt auf die Standardausgabe, sodass Entwickler über den Fortschritt von Saxons Arbeit auf dem Laufenden bleiben.

Jede HTML-Seite, die einen Eintrag wiedergibt, soll Links auf den vorhergehenden und den folgenden Eintrag (so vorhanden) enthalten - und zum Inhaltsverzeichnis (Abb. 2).

HTML-Gewohnten sollte der größte Teil des Stylesheet fast bekannt vorkommen. Was fehlerträchtig ist: die Navigation. Wie Abbildung 2 zeigt, enthalten alle Einträge bis zu drei Verweise: auf die Übersichtsdatei sowie auf den vorherigen und den folgenden Eintrag. Die bereits genannten Achsen helfen beim Navigieren, allerdings ist darauf zu achten, dass zwischen preceding-sibling und following-sibling ein kleiner Unterschied ist. Das vorherige und das folgende Nachbarelement müssen unterschiedlich angesprochen werden (siehe unten).

Abzufragen ist, ob der gegenwärtige Eintrag nicht der erste oder letzte ist, weil das Stylesheet in diesem Fall weniger ausgeben muss. Der Hinweis auf die Übersicht soll immer erfolgen. Die beiden XPath-Ausdrücke

not(position()=1)
not(position()=last())

stellen klar, ob Anfang oder Ende erreicht sind; abhängig davon ist es, ob das vorherige/nächste Element referenziert wird. Bei dem Verweis auf eins der beiden fällt ein Unterschied auf:

preceding-sibling::entry[1]/@id 
preceding-sibling::entry[1]/acro
following-sibling::entry/@id
following-sibling::entry/acro

Fehlt ‘[1]’ in den ersten beiden Zeilen, resultiert daraus eine Referenz auf den allerersten entry - und nicht auf den direkt vor dem gegenwärtigen sich befindenden. Grund dafür ist, dass xsl:value-of ohne das ‘[1]’ den ersten Knoten in der Dokumentenreihenfolge ausgibt. In dieser Form lässt sich die Navigation in vielen unterschiedlichen Dokumentenfällen realisieren.

Listing 9 bindet die bisher diskutierten Teile des Stylesheet ein und sorgt durch das Root-Template dafür, dass sowohl die Übersicht als auch die einzelnen Einträge im Verzeichnis html landen. Hier und nur hier sind die Templates für die kleinen Dinge des Stylesheet zu finden: wie ref und Anderes zu verarbeiten sind.

Auch wenn es sich hier um eine kleine Anwendung handelt, ist sie doch in sich vollständig. Im nächsten Teil wird die XML-Quelle tiefer strukturiert sein. Außerdem soll es unter anderem ums Nummerieren von Elemente gehen. Die lauffähigen Listings stehen, wie bei Tutorials üblich, in einem Archiv auf dem FTP-Server der iX zum Download bereit.

[1] Michael Kay; XSLT Programmer’s Reference; Birmingham (Wrox Press) 2000

[2] Henning Behme, Stefan Mintert; XML in der Praxis, 2. Auflage; München (Addison-Wesley) 2000

[3] Henning Behme; Web-Programmierung; Stil-Leben; XSLT: Transformation von XML-Dokumenten

[4] Julian F. Reschke; Web-Programmierung; Strukturhilfe; Editieren von HTML mit XSLT; iX 9/2000, S. 163

[5] Oliver Brüning; XML-Entwicklung; Dokumententausch; X4Dialog: Hilfe für dynamische Webseite; iX 10/2000, S. 102

[6] Oliver Becker; XML-Programmierung; Mustergültig; Schematron: XSLT zur Validierung von XML-Dokumenten nutzen; iX 11/2000, S. 218

Mehr Infos

iX-TRACT

  • XPath und XSLT sind die vom W3C entwickelten Sprachen, mit deren Hilfe XML-Dokumente sich verarbeiten lassen.
  • XPath-Ausdrücke und XSLT-Templates sind die Grundelemente aller Stylesheets (XSLT-Programme).
  • Wenn die XSLT-Programme komplexer werden, lassen sie sich leicht modularisieren
Wichtige XSLT-Anweisungen
Name Attribute Inhalt
apply-imports - -
apply-templates select, mode xsl:sort, xsl:with-param
attribute name, namespace Template
call-template name xsl:with-param*
choose - xsl:when, xsl:otherwise
comment - Template
copy use-attribute-sets Template
copy-of select -
element name, namespace, use-attribute-sets Template
fallback - Template
for-each select xsl:sort, Template
if test Template
message terminate Template
number level, count, from, value, forma, lang, letter-value, grouping-separator, grouping-size -
otherwise - Template
processing-instruction name Template
sort select, lang, data-type, order, case-order -
text disable-output-escaping:Text ohne Auszeichnung -
value-of select, disable-output-escaping -
when test Template
with-param name, select Template
Mehr Infos

LISTING 10: div.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:saxon="http://icl.com/saxon"
saxon:trace="no"
extension-element-prefixes="saxon">

<xsl:param name="thisday"/>
<xsl:param name="thismonth"/>
<xsl:param name="thisyear"/>

<xsl:template name="do-foot">
<!-- ..............foot.................. -->
<tr>
<td>
<img src="/ix/images/dots/1tr.gif" alt="vertical space"
width="1" height="25"/>
<p class="end">
<saxon:entity-ref name="copy"/>
<xsl:text> </xsl:text>
<a href="mailto:hb@ix.heise.de">hb</a>, 2000
<xsl:text>Letzte Veränderung / last modification: </xsl:text>
<xsl:value-of select="$thisday"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="$thismonth"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$thisyear"/>
</p>
</td>
</tr>
</xsl:template>

</xsl:stylesheet>
Mehr Infos

LISTING 11: dictionary.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

<!DOCTYPE dictionary SYSTEM "dictionary.dtd">

<dictionary>

<!-- CSS -->

<entry id="css" cat="web">
<acro>CSS</acro>

<term>Cascading Style Sheets</term>

<expl>Sprache für die Formatierung von <ref
idref="html">HTML</ref>-Dokumenten. Mit ihrer Hilfe lassen sich
Schrifttyp, Farbe und andere Layoutdetails für beliebig viele
Web-Seiten festlegen. Alternativ kann man im Einzeldokument
ebenfalls Anweisungen vornehmen (die importierte überschreiben).</expl>

<expl lang="en">Language to format <ref idref="html">HTML</ref>
documents. It enables authors to set font, colour and other layout
details for their web pages (any number of them). Alternatively,
you can put specific statements in a single document, which
override any imported ones.</expl>

<url>http://www.heise.de/ix/raven/Web/css.html</url>

</entry>

<!-- DHTML -->

<entry id="dhtml" cat="web">
<acro>DHTML</acro>

<term>Dynamic HTML</term>

<expl>Von Microsoft und Netscape auf unterschiedliche Weise
realisierte Möglichkeit, Web-Seiten interaktiv zu machen (etwa das
Verschieben von Elementen).</expl>

<expl lang="en">Making web pages interactive, which Microsoft and
Netscape both implemented (e. g. moving
elements of the page), albeit differently.</expl>

</entry>

<!-- DSSSL -->

<entry id="dsssl" cat="web">
<acro>DSSSL</acro>

<term>Document Style and Semantics Specification Language</term>

<expl>Sprache für die Formatierung von <ref
idref="sgml">SGML</ref>-Dokumenten. In abgespeckter Form wird sie
auch für <ref idref="xml">XML</ref> die Formatierung
übernehmen. Das <ref idref="w3c">W3C</ref> diskutiert derzeit einen von
Microsoft, ArborText, Inso und Einzelpersonen einegereichten
Vorschlag (<ref idref="xsl">XSL</ref>).</expl>

<expl lang="en">Language for the formatting of <ref
idref="sgml">SGML</ref> documents, which will, in a diminuished
form, though, be the style sheet language for <ref
idref="xml">XML</ref>, too. The <ref idref="w3c">W3C</ref> is currently
reviewing a proposal put forward by Microsoft, ArborText, Inso and
a few individuals.</expl>

<url>http://www.heise.de/ix/raven/Web/dsssl.html</url>
<source>iX 3/98, S. 156</source>
</entry>

<!-- DTD -->

<entry id="dtd" cat="web">
<acro>DTD</acro>

<term>Document Type Definition</term>

<expl>Beschreibung der Struktur von <ref idref="sgml">SGML</ref>-
und <ref idref="xml">XML</ref>-Dokumenten
</expl>

<expl lang="en">Description of <ref idref="sgml">SGML</ref> and
<ref idref="xml">XML</ref> documents.
</expl>

<source>iX x/98, S. xxx (= demnächst :-)</source>
</entry>

<!-- HTML -->

<entry id="html"
cat="web">
<acro>HTML</acro>

<term>Hypertext Markup Language</term>

<expl><p>Von <person>
<fname>Tim</fname>
<lname>Berners-Lee</lname></person> 1989 erfundene Sprache, die es ermöglicht, Dokumente weltweit zur Verfügung zu stellen und zu lesen.
</p></expl>

<expl lang="en"><p>Markup language, invented by <person>
<fname>Tim</fname> <lname>Berners-Lee</lname></person> in 1989,
which makes it possible to provide documents for world wide use
(reading).</p></expl>

<url>http://www.w3.org/History/1989/proposal.html</url>
<source>iX 3/94, S. 170</source>
<source>iX 9/97, S, 40</source>
</entry>

<!-- HTTP -->

<entry id="http"
cat="web">
<acro>HTTP</acro>

<term>Hypertext Transport Protocol</term>

<expl>Protokoll zur Übertragung von <ref idref="html">HTML</ref>-Dokumenten.
</expl>

<expl lang="en">Protocol for transmission of <ref idref="html">HTML</ref> documents.
</expl>

<source>iX 3/94, S. </source>
</entry>

<!-- LPD -->

<entry id="lpd" cat="web">
<acro>LPD</acro>

<term>Link Process Definition</term>

<expl>Aus dem <ref idref="sgml">SGML</ref>-Bereich: Enthält
Informationen darüber, welcher Start-Tag automatisch mit
Attributen versehen wird.</expl>

<expl lang="en">In the <ref idref="sgml">SGML</ref> realm:
contains information on which start tag will automatically have
which attributes.</expl>

<source>iX 7/95, S. 130</source>
</entry>

<!-- MIME -->

<entry id="mime" cat="web">
<acro>MIME</acro>

<term>Multipurpose Internet Mail Extensions</term>

<expl>Erweiterungen von EMails über reinen Text hinaus (inklusive
Bild und Ton &amp; c.).</expl>

<expl lang="en">Extensions of EMail beyond mere text (including
image and sound &amp; c.).</expl>

<source>iX !!!</source>
</entry>

<!-- NCSA -->

<entry id="ncsa" cat="web">
<acro>NCSA</acro>

<term>National Center for Supercomputing Applications</term>

<expl>US-Forschungszentrum an der Universität von Illinois, das
durch den dort entwickelten Browser Mosaic dem Web zum
Durchbruch verholfen haben dürfte.</expl>

<expl lang="en">US Research centre at the University of Illinois,
which made the web the success it now is, by the browser Mosaic,
which was developed there.</expl>

<url>http://www.ncsa.uiuc.edu/</url>
<source>iX 2/94, S. 150 und 158</source>
</entry>
<!-- OPS -->

<entry id="ops" cat="web">
<acro>OPS</acro>

<term>Open Profiling Standard</term>

<expl><p>Von Netscape, Firefly und VeriSign (IBM, HP, Sun und
Microsoft machen mit) dem <ref idref="w3c">W3C</ref> vorgelegte
Spezifikation für die Übertragung von Benutzerdaten. Anwender
kontrollieren selbst, was an wen übertragen werden soll. OPS
arbeitet mit <ref idref="http">HTTP</ref>, vCard und <ref
idref="pgp">PGP</ref>.</p> </expl>

<expl lang="en"><p>Specification for the transmission of
user-related data, which Netscape, Firefly and VerSign submitted
to the <ref idref="w3c">W3C</ref>. Users have control over who
gets which information. OPS works with <ref
idref="http">HTTP</ref>, vCard and <ref
idref="pgp">PGP</ref>.</p></expl>

<source>iX 9/97, S. 44</source>
</entry>

<!-- OTP -->

<entry id="otp" cat="web">
<acro>OTP</acro>

<term>Open Trade Protocol</term>

<expl><p>Handelsprotokoll, das weltweiten elektronischenHandel
über die eigentlich unsicheren Netze ermöglichen soll. Firmen wie
AT&amp;T, CyberCash, DigiCash, HP, IBM, Netscape und Oracle
arbeiten daran.</p></expl>

<expl lang="en">Trade protocol that is meant to make world wide
electronic trade via unsafe networks possible. Companies like
AT&amp;T, CyberCash, DigiCash, HP, IBM, Netscape or Oracle are
working on it.</expl>


<url>http://www.otp.org</url>

<source>iX 3/98, S. 122</source>
</entry>

<!-- PGP -->

<entry id="pgp" cat="web">
<acro>PGP</acro>

<term>Pretty Good Privacy</term>

<expl>Philip Zimmermanns Implementierung des <ref
idref="rsa">RSA</ref>-Algorithmus ermöglicht es Privatanwendern,
ihre Nachrichten zu verschlüsseln.</expl>

<expl lang="en">Philip Zimmermann's implementation of the <ref
idref="rsa">RSA</ref> algorithm enables private users to encrypt
their own messages.</expl>

<source>iX 3/94, S. 208</source>
</entry>

<!-- PICS -->

<entry id="pics"
cat="web">
<acro>PICS</acro>

<term>Parental Internet Content Selection</term>

<expl><ref idref="w3c">W3C</ref>-Projekt zur Kennzeichnung von
Web-Inhalt, damit Eltern festlegen können, was Kinder per Browser
(nicht) gezeigt bekommen.
</expl>

<expl lang="en"><ref idref="w3c">W3C</ref> project to mark web
content in order to enable parents to make sure their children
don't encounter some of the milder swear words :-)
</expl>

</entry>

<!-- RFC -->

<entry id="rfc" cat="web">
<acro>RFC</acro>

<term>Request For Comment</term>

<expl>Höfliche Umschreibung für einen Vorschlag zu einem
Internet-Standard. Dasa Internic hält sie alle öffentlich vor.</expl>

<expl lang="en">Polite circumscription of what really is
how Internet standards are submitted. Internic has all
the RFCs.</expl>
</entry>

<!-- RSA -->

<entry id="rsa" cat="web">
<acro>RSA</acro>

<term>Rivest, Shamir and Adelman</term>

<expl lang="de">Nach Ronald Rivest, Adi Shamir und
Leonard Adelman benannter Algorithmus (Verschlüsselung)</expl>

<expl lang="en">Algorithm, named after Ronald Rivest, Adi Shamir and
Leonard Adelman (encryption))</expl>

</entry>

<!-- SGML -->

<entry id="sgml"
cat="web">
<acro>SGML</acro>

<term>Standard Generalized Markup Language</term>

<expl>Mächtige Sprache zu Auszeichnung fast beliebiger
Dokumente. Da sie zu komplex fürs Web ist, hat das <ref
idref="w3c">W3C</ref> <ref idref="xml">XML</ref> entwickelt.
</expl>

<expl lang="en">Powerful markup language for almost any
document. As it is too complex for the Web the <ref
idref="w3c">W3C</ref> developed <ref idref="xml">XML</ref>.
</expl>

<source>iX 7/95, S. 126</source>
</entry>

<!-- STFP -->

<entry id="stfp" cat="web">
<acro>STFP</acro>

<term>SGML Tree Formatting Process</term>

<expl>Zweiter Schritt (von zweien, siehe <ref
idref="sttp">STTP</ref>), den <ref idref="dsssl">DSSSL</ref> zum
Formatieren von <ref idref="sgml">SGML</ref>-Dokumenten
unternimmt.</expl>

<expl lang="en">Second step (of two, see <ref
idref="sttp">STTP</ref>), which <ref idref="dsssl">DSSSL</ref>
will undergo in order to format <ref idref="sgml">SGML</ref>
documents.</expl>

<source>iX 5/97, S. 130</source>
</entry>

<!-- STTP -->

<entry id="sttp" cat="web">
<acro>STTP</acro>

<term>SGML Tree Transformation Process</term>

<expl>Erster Schritt (von zweien, siehe <ref
idref="stfp">STFP</ref>), den <ref idref="dsssl">DSSSL</ref> zum
Formatieren von <ref idref="sgml">SGML</ref>-Dokumenten
unternimmt.</expl>

<expl lang="en">First step (of two, see <ref
idref="stfp">STFP</ref>), which <ref idref="dsssl">DSSSL</ref>
will undergo in order to format <ref idref="sgml">SGML</ref>
documents.</expl>

<source>iX 5/97, S. 130</source>
</entry>

<!-- VRML -->

<entry id="vrml" cat="web">
<acro>VRML</acro>

<term>Virtual Reality Modeling Language</term>

<expl>Sprache zur Realisierung dreidimensionaler Raumdarstellung im
Web. Neuer Name seit Anfang 1999: Web3D...</expl>

<expl lang="en">Language that enables you to create
threedimensional space on the web. Got a new name early in 1999: Web3D.</expl>

<url>http://www.vrml.org</url>
<source>iX 5/97, S. 74</source>
</entry>

<!-- W3C -->

<entry id="w3c"
cat="web">

<acro>W3C</acro>

<term>World Wide Web Consortium</term>

<expl><p>Das Consortium, das mitgliederorientiert arbeitet
(viele Firmen wie IBM, Sun, Microsoft, Netscape &amp;c. sind dabei)
und versucht, Web-Standards wie <ref idref="html">HTML</ref>,
<ref idref="http">HTTP</ref> oder <ref idref="pics">PICS</ref>
zu setzen und entwickeln.</p></expl>

<expl lang="en"><p>The Consortium, which works member-oriented
(many companies like IBM, Sun, Microsoft, Netscape &amp;c. are part
of it), tries to set and develop standards like
<ref idref="html">HTML</ref>, <ref idref="http">HTTP</ref> or
<ref idref="pics">PICS</ref>.</p>
</expl>

<url>http://www.w3.org</url>
</entry>

<!-- XML -->

<entry id="xml"
cat="web">
<acro>XML</acro>

<term>Extensible Markup Language</term>

<expl><p>Als Teilmenge von <ref idref="sgml">SGML</ref> eignet sich
XML gut für <ref idref="genericmarkup">generic markup</ref>
von Dokumenten, die fürs Web gedacht sind.</p>

<p>Anders als <ref idref="html">HTML</ref> ermöglicht es
Anwendern beispielsweise, ihre eigenen <ref idref="dtd">Document
Type Definitions</ref> zu definieren (Datentypen und Struktur).</p>
</expl>

<expl lang="en"><p>XML as a subset of <ref idref="sgml">SGML</ref> is
well suited for the <ref idref="genericmarkup">generic markup</ref>
of documents inteded for Web use.</p>

<p>Unlike <ref idref="html">HTML</ref> it enables users e. g. to
define their own <ref idref="dtd">Document Type Definitions</ref>
(data types and/or structure).</p>
</expl>

<url>http://www.heise.de/ix/raven/web/xml/</url>
</entry>

</dictionary>

(hb)