XMLidP2000

Sitemap

Sitemap

1 Einführung
1.1 Warum mehr weniger ist
1.2 Warum mehr mehr ist
1.3 Wohin die Reise geht
2 Was sind Dokumente?
2.1 Eine kurze Geschichte der Textverarbeitung
2.2 Bestandteile eines Dokumentes
2.3 Die neue, alte Idee: Strukturorientiert schreiben
2.4 Die Entwicklung des Hypertextes
2.5 Textformate im Web
2.6 Das SGML-Konzept: Generic Markup
2.7 Dokumente versus Daten
3 XML im Web
3.1 XML bei der Verwaltung von Websites
3.2 Clientseitige XML-Interpretation
3.2.1 XML mit CSS
3.2.2 XML mit XSL(T)
3.3 XML auf dem Server
3.4 Linking-Möglichkeiten von XML
3.5 XML als Datenaustauschformat
4 XML Quick Start
4.1 Dokumenttyp-Definition (DTD) und Instanzen
4.2 Verarbeitung der Dokumente
4.2.1 Beispiel: Verarbeitung mit Cost/TCL
4.2.2 Beispiel: Verarbeitung mit XSLT
4.2.3 Beispiel: XML/XSLT im Internet Explorer
4.2.4 Fazit
5 XML-DTDs: Die verständliche Beschreibung
5.1 Ein Wort zur Notation
5.2 Dokumente
5.3 Elemente
5.4 Zeichen, Namen und Zeichendaten
5.5 Kommentare
5.6 Processing Instructions
5.7 Wo bleibt Multimedia?
5.8 Dokumenttyp-Definition (DTD)
5.8.1 Elementtyp-Deklaration
5.8.2 Attributlisten-Deklaration
5.8.3 Möglichkeiten, die DTD zu gestalten und zu gliedern
5.8.4 Notation-Deklaration
6 Namensräume in XML
7 XPath: Adressierung von XML-Dokumentteilen
7.1 Zu Grunde liegendes Datenmodell
7.2 Zugriff auf den Datenbaum
7.3 Hilfe von Operatoren
7.4 Kernfunktionen für den Datenzugriff
8 XML: Linking
8.1 Notwendige Begriffe
8.2 XLink: einfache und erweiterte Links
8.2.1 Einfache Verweise
8.2.2 Erweiterte Links
8.2.3 XLink in der Praxis
8.3 XPointer: Verweise in Dokumente hinein
8.3.1 XPath-Erweiterungen in XPointer
9 Überblick über Stylesheet-Sprachen
9.1 Cascading Style Sheets
9.1.1 Wertzuweisungen
9.1.2 Formatierungsmodell
9.1.3 CSS und XML
9.1.4 Ein Beispiel: XML im Mozilla
9.2 Document Style Semantics and Specification Language
9.2.1 Flow Objects
9.2.2 Verarbeitungs-Modus
9.2.3 DSSSL praktisch
9.2.4 Langer Marsch von DSSSL nach HTML
9.3 Extensible Stylesheet Language (XSLT und XSL)
9.3.1 Verhältnis von XSLT zu XSL
9.3.2 Formatierung mit XSL
10 XSL-Transformationen
10.1 Grundsätzliches über Templates
10.2 Ergänzungen zum Datenmodell von XPath
10.3 Struktur von XSLT-Stylesheets
10.4 Den Ergebnisbaum erzeugen
10.4.1 Diverse Basiselemente
10.4.2 Formatierte Nummerierung
10.4.3 Schleifen und bedingte Verarbeitung
10.4.4 Sortieren
10.4.5 Variable und Parameter
10.4.6 Zusätzliche Funktionen
10.4.7 XSLT-Erweiterungen
10.4.8 message, output
11 XSLT in Web-Anwendungen
11.1 XSLT im Internet Explorer
11.2 Linklisten erzeugen
11.3 Details einer Literaturgeschichte
11.3.1 Sortierte Überblicksseiten
11.3.2 Kalender: einzelne Tage ausgeben
12 XML-Editoren
12.1 Übersicht
12.1.1 Emacs + PSGML (mit XML-Unterstützung)
12.1.2 XML Notepad
12.1.3 XML Spy
12.1.4 XMetal
12.1.5 Epic
12.1.6 MarkupKit (für MS Word)
12.1.7 WordPerfect Office2000
12.2 Emacs und PSGML (mit XML-Unterstützung)
12.3 XML-Notepad
12.4 XML Spy
12.5 XMetal
12.6 Epic
12.7 MarkupKit (für MS Word)
12.8 WordPerfect Office2000
12.9 Fazit
13 Entwicklung einer DTD
13.1 Auswahl einer Mehrzweck-DTD
13.2 Entwurf einer DTD
13.2.1 Dokumentanalyse
13.2.2 Tipps und Tricks
13.3 Instanzen ohne DTD
14 Herstellung dieses Buches
14.1 Zielsetzung und Randbedingungen
14.2 Definition der DTD
14.2.1 Schritt 1: Die Grobstruktur
14.2.2 Schritt 2: Elemente auf Zeichenebene
14.2.3 Schritt 3: Die Details
14.3 Formatieren des Manuskriptes
14.3.1 Konvertierung in HTML
14.3.2 Aufbereitung für den Ausdruck
14.4 Erfahrungen mit der zweiten Auflage
15 Anwendungsbeispiel Literatur
15.1 Vorüberlegungen
15.2 En détail: die Autoren in der DTD
15.3 Wie die Daten ins Web gelangen
15.3.1 Inhaltsverzeichnis generieren
15.3.2 Ausgabe der Autorendaten
15.4 Vollständige Listings
15.4.1 DTD für die Literaturgeschichte
15.4.2 DSSSL-Listing: Inhaltsverzeichnis
15.4.3 DSSSL-Listing: Ausgabe eines einzelnen Autors
15.4.4 Perl-Code für Ausgabe einzelner Autoren
16 Verteilte Softwareverwaltung mit XML
16.1 Aufgabenbeschreibung
16.2 XML als Datenbasis
16.3 Bilden von DTD-Hierarchien
16.4 Zusammentragen von verteilten XML-Fragmenten
16.5 Fazit
16.6 Stylesheet zur Transformation in HTML
17 E-Commerce mit XML
17.1 B2B-E-Commerce
17.1.1 Die Rolle von XML
17.1.2 Technische Aspekte
17.2 BMEcat
17.3 Electronic Business XML (ebXML)
17.3.1 Arbeitsgruppen
17.3.2 Zeitplan des Projekts
17.4 XML und EDIFACT
18 XML und Apache
18.1 XML-Transformation per CGI
18.1.1 Konfiguration des Servers
18.1.2 CGI-Skript: xmlhandler.cgi
18.1.3 Beispiel: von HTML nach HTML mit DSSSL oder XSLT
18.2 Cocoon
18.2.1 Extensible Server Pages (XSP)
18.2.2 Beispiel: Formatierung in PDF mit XSL
18.2.3 Beispiel: Simuliertes XLink mit Dynamic HTML/JavaScript
18.2.4 Installation
19 XHTML: Neues HTML 4 — erweiterbar
19.1 Status quo: HTML neu definiert
19.2 Modulare Zukunft
20 Transformation von XML in WML und HTML
20.1 Erzeugen der WML-Dateien
20.2 Erzeugen der HTML-Dateien
21 Ausblick
21.1 XML Schema
21.2 Programmierung mit XML-Daten
21.3 XML und Java
21.4 Resource Description Framework
21.5 Die Zukunft
A Extensible Markup Language (XML) 1.0
A.1 Einleitung
A.1.1 Herkunft und Ziele
A.1.2 Terminologie
A.2 Dokumente
A.2.1 Wohlgeformte XML-Dokumente
A.2.2 Zeichen
A.2.3 Allgemeine syntaktische Konstrukte
A.2.4 Zeichendaten und Markup
A.2.5 Kommentare
A.2.6 Processing Instructions
A.2.7 CDATA-Abschnitte
A.2.8 Prolog und Dokumenttyp-Deklaration
A.2.9 Standalone-Dokumentdeklaration
A.2.10 Behandlung von Leerraum
A.2.11 Behandlung des Zeilenendes
A.2.12 Identifikation der Sprache
A.3 Logische Strukturen
A.3.1 Start-Tags, End-Tags und Leeres-Element-Tags
A.3.2 Elementtyp-Deklarationen
A.3.3 Attributlisten-Deklaration
A.3.4 Bedingte Abschnitte
A.4 Physikalische Strukturen
A.4.1 Zeichen- und Entity-Referenzen
A.4.2 Entity-Deklarationen
A.4.3 Analysierte Entities
A.4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor
A.4.5 Konstruktion des Ersetzungstextes von internen Entities
A.4.6 Vordefinierte Entities
A.4.7 Notation-Deklarationen
A.4.8 Dokument-Entity
A.5 Konformität
A.5.1 Validierende und nicht-validierende Prozessoren
A.5.2 Benutzen von XML-Prozessoren
A.6 Notation
A.7 Anhang A: Referenzen
A.7.1 Normative Referenzen
A.7.2 Weitere Referenzen
A.8 Anhang B: Zeichenklassen
A.9 Anhang C: XML und SGML (nicht normativ)
A.10 Anhang D: Expansion von Entity- und Zeichenreferenzen (nicht normativ)
A.11 Anhang E: Deterministische Inhaltsmodelle (nicht normativ)
A.12 Anhang F: Automatische Erkennung von Zeichenkodierungen (nicht normativ)
A.13 Anhang G: XML-Arbeitsgruppe des W3C (nicht normativ)
B Verknüpfen von Style Sheets mit XML-Dokumenten Version 1.0
B.1 Die xml-stylesheet-Processing-Instruction
B.2 Anhang A: Referenzen
B.3 Anhang B: Begründung
C Verhältnis von XML zu SGML und HTML
C.1 XML und SGML
C.2 XML und HTML
D Übersichten
D.1 Cascading Style Sheets
D.1.1 CSS-Eigenschaften und -Werte
D.1.2 CSS-Muster
D.2 DSSSL: Flow Objects
D.3 Syntax der XSLT-Elemente
D.4 DTD-Fragment für XSLT-Stylesheets (nicht normativ)
D.5 Relevante Spezifikationen und Organisationen
D.5.1 International Organization for Standardization
D.5.2 World Wide Web Consortium
D.5.3 Organization for the Advancement of Structured Information Standards
D.5.4 Internet Society und Internet Engineering Task Force
D.5.5 ISO-639-Sprachcodes
D.5.6 ISO-3166-Ländercodes
D.5.7 Zeichensatz ISO-Latin-1
D.5.8 Sonderzeichen
D.6 XML-1.0-Regeln

10.3 Struktur von XSLT-Stylesheets

XSLT ist ein Bestandteil von XSL, der Stilsprache von XML, und für die Wandlung von XML-Dokumenten der einen Art in eine andere vorgesehen. Die Sprache lässt sich sowohl mit als auch ohne die Formatierungssprache XSL im engeren Sinne verwenden, denn eigentlich ist sie — im weiteren Sinne — deren Bestandteil. XSL im engeren Sinne ist hier die Sprache, die die Formatierung eines XML-Dokuments beschreibt — oft auch XSL-FO genannt (wegen der Formatier-Objekte).

Stylesheets: Schablonen und Muster

Dass XSLT-Instanzen überhaupt Stylesheets genannt werden, hat zum einen historische Gründe; zum anderen haben sie tatsächlich diese Funktion, wenn sie das XML-Dokument mit den Formatierungsanweisungen versehen. Transformations-Stylesheets sind wohlgeformte XML-Dokumente, die der W3C-Empfehlung für Namensräume entsprechen müssen (siehe unten und das Kapitel 6). Sie bestehen aus einer Ansammlung von template-Regeln, die sich wiederum jeweils aus zwei Teilen zusammensetzen: einem Muster (pattern) und einer Schablone (template), die im Prozess der Transformation gleichsam aufgerufen wird. So entsteht je nach Art der Transformationen aus einem Quellbaum ein möglicherweise völlig anders gearteter Zielbaum.

Beispiel

Aus dem XML-Quellcode des obigen Absatzes

<absatz>Dass <acro>XSLT</acro>-Instanzen überhaupt
<em>Stylesheets</em> genannt werden, hat zum einen
historische Gründe; ...</absatz>

macht das folgende Bruchstück eines Stylesheet HTML:

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

<xsl:template match="acro">
  <span class="acronym">
    <xsl:value-of select="."/>
  </span>
</xsl:template>

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

wobei das erste Template einen Absatz (p) erzeugt und das Ergebnis weiterer Templates in ihn packt, während die beiden anderen ein Element span beziehungsweise ein em mit dem jeweiligen Textinhalt generieren.

Hinweis

Dass XSLT-Dokumente wohlgeformtes XML beinhalten, dürfte der Hauptgrund dafür sein, dass diese Transformationssprache sich durchgesetzt hat. Wie gelegentlich in Andeutungen zu hören war, galt in einer frühen Phase der Diskussion um die Stilsprache (Formatierung und Transformation) das damals schon als Vorschlag vorliegende DSSSL-O von Jon Bosak als nicht mehrheitsfähig, vor allem weil es für Web-Autoren viel zu schwierig sei. Es handelte sich bei DSSSL-O um eine abgespeckte Version von DSSSL, der Transformations- und Formatierungssprache für SGML, eine Scheme-Implementierung.

Wie sich in diesem und in den praktischen Kapiteln zeigen wird, ist XSLT allerdings ebenso wenig geeignet, von Webautoren benutzt zu werden, die mit WYSIWYG-Autorenwerkzeugen zu arbeiten gewohnt sind. XSLT ist zwar nicht gerade Lisp, aber die Kontrolle über das, was das Stylesheet im Einzelnen macht, zu behalten, erfordert eine Art Programmiererblick (siehe zum Beispiel die Abfragen in Abschnitt 20.1).

Zwingender Bestandteil einer XSLT-Instanz ist stylesheet als Wurzelelement, das definiert, dass es sich bei diesem Dokument um XSLT handelt. Es muss mindestens das Attribut version und einen Verweis auf den Namensraum enthalten:

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

<!-- Inhalt des Stylesheet: weitere Schablonen -->

</xsl:stylesheet>
Vorsicht!

Statt der drei Buchstaben xsl könnte man eine beliebige Zeichenkette verwenden, um den XSLT-Namensraum zu bezeichnen (der allerdings muss heißen wie oben). Es ist allerdings zu befürchten, dass XSLT-Implementierungen stillschweigend von xsl ausgehen und Fehler ausgeben, wenn man den Namen tatsächlich frei wählt.

Derzeit muss version den Wert 1.0 haben; und der Namensraum dieser Version von XSLT ist der in xmlns (XML-Namespace) angegebene. Das heißt, es dürfte weitere Versionen dieser Transformationssprache geben, und das W3C könnte sich auch entschließen, im Jahre 2001 eine neue Fassung der Version 1.0 herauszugeben. xsl:stylesheet kann weitere Namensraumfestlegungen enthalten. Und über diese beiden Attribute hinaus darf das Element auch eine Kennung (id) besitzen, sodass man ein Stylesheet auch aufrufen kann. Statt stylesheet kann alternativ transform stehen. Alle Elemente des XSLT-Namensraums müssen den dazugehörigen Bezeichner vorangestellt haben:

<xsl:import href="x.xsl"/>
Hinweis

Eine Ausnahme von der strikten Regel oben existiert allerdings: wenn das gesamte Stylesheet nur eine Schablone für den Wurzelknoten (/) enthält. Bezogen auf das in XML definierte HTML sähe ein solches verkürztes Stylesheet folgendermaßen aus:

Beispiel
<html version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/TR/xhtml1/strict">

  <head>
    <title>mein Titel<title>
  <head>
  <body>
   <p><xsl:value-of select="//p/@id='id42"/><p>
  </body>
</html>
          

Dadurch dass nicht unterschiedliche Templates existieren, die einander aufrufen, sondern das gesamte Stylesheet in HTML erzeugt wird, ist das Element stylesheet nicht erforderlich. Aus dem im Element html deklarierten Namensraum von XSLT kommt hier lediglich value-of zum Tragen. Obiges Stylesheet entspricht einem, das nur ein Template für / zum Inhalt hat und darin die HTML-Ausgaben wie oben erzeugt.

Für Stylesheets, die sich auf eine spätere, derzeit noch nicht existierende Version von XSLT beziehen, hat das W3C vorgesehen, dass Autoren durcheine Abfrage der Version Abwärtskompatibilität sicherstellen können. Ein Stylesheet, das mit xsl:stylesheet version="1.2"  ... beginnt, kann beispielsweise über test="system-property('xsl:version') > 1.0" dafür sorgen, dass Eigenschaften der späteren Version nur in diesem Fall (Version > 1.0) zum Tragen kommen.

Abgesehen vom Wurzel-Element xsl:stylesheet sieht XSLT eine beliebige Anzahl weiterer Elemente vor. Einige davon sind explizit und nur direkt unterhalb von xsl:stylesheet erlaubt (so genannte Top-Level-Elemente). Hinter der beliebigen Anzahl stecken diejenigen, die in den Templates zu finden sind. Die Top-Level-Elemente sind der folgenden Tabelle zu entnehmen.

Element Aufruf Bedeutung
xsl:import <xsl:import href=""datei.xsl"/> Import eines Stylesheet; das importierende hat Vorrang (überschreibt im Falle von Überschneidungen)
xsl:include <xsl:include href="datei.xsl"/> Kopiert ein Stylesheet in das aufrufende
xsl:strip-space <xsl:strip-space elements=" [Elementliste] "/> Liste von Elementen, bei denen mehrere Leerraumzeichen zu einem verkürzt werden
xsl:preserve-space <xsl:preserve-space elements=" [Elementliste] "/> Liste von Elementen, bei denen mehrere Leerraumzeichen erhalten bleiben
xsl:output <xsl:output method="xml" encoding="ISO-8859-1"/> Legt unter anderem fest, ob die Ausgabe XML oder HTML sein soll, aber auch den Dokumenttyp und ob das Ergebnis eingerückt werden soll
xsl:key <xsl:key name="mykey" match="p" use="@name"/> Erlaubt das Generieren von Cross-Referenzen; anders als ein Attribut vom Type id auf alle anwendbar
xsl:decimal-format <xsl:decimal-format name="deutsch" decimal-separator=","/> Legt fest, wie das Trennzeichen für reelle Zahlen aussehen soll
xsl:namespace-alias <xsl:namespace-alias stylesheet-prefix="nonxsl" result-prefix="xsl"> Alias für Stylesheets, die Styösheets erzeugen; erlaubt es beispielsweise, im XSLT-Stylesheet wie hier, nonxsl als zu benutzendes Präfix zu deklarieren, im Ergebnis aber xsl zu verwenden
xsl:attribute-set <xsl:attribute-set name="myname"> <!-- Setzen einzelner Attribute durch --> <xsl:attribute name="myname">myvalue</xsl:attribute> </xsl:attribute-set> Erlaubt die Definition einer Menge von Attributen, die xsl:element über das Attribut use-attribute-sets nutzen kann; Inhalt ist eine Menge von xsl:attribute-Zuweisungen
xsl:variable <xsl:variable name="myname">myvalue</xsl:variable> Deklaration einer Variablen myname, die den Wert myvalue hat
xsl:param <xsl:param name="thisparam"/> Globale Deklaration eines Parameters, dessen Wert dem Stylesheet mit thisparam="meinparam" übergeben wird
xsl:template <xsl:template match="absatz">...</xsl:template> Element, das eine durch das Muster absatz definierte Menge von Knoten bearbeitet
<xsl:template name="myname">...</xsl:template> Element, das über seinen Namen myname adressiert wird statt über ein Muster

Für komplexe Stylesheets sind die beiden ersten besonders wichtig, denn sie ermöglichen es, Stylesheets aus mehreren zusammenzusetzen, das heißt beispielsweise, in einem Root-Template das Aussehen aller Ergebnisse (die Corporate Identity) vorzugeben. Von der anderen Seite betrachtet, dient import auch dazu, Allgemeines durch Konkretes zu überschreiben.

Beispiel

Dazu ein Beispiel: Generell dürfte ein Stylesheet für die Transformation von Gedichten (a) eine Schablone wie die folgende beinhalten:

<!--  Stylesheet-Fragment (a) -->
<xsl:template match="line">
  <xsl:apply-templates /><br />
</xsl:template>
          

Dies Template bewirkt die Ausgabe einer Zeile (line), gefolgt von einem Zeilenumbruch (<br />). Soll aber in einem konkreten Gedicht eine Zeile (oder mehrere) nicht nur ausgegeben werden, muss ein neues Stylesheet (b) her, das (a) importiert und nur das Template für die einzelne Zeile überschreibt:

<!-- Stylesheet-Fragment (b) -->
<xsl:import href="poem.xsl"/>

<xsl:template match="line">
    <xsl:if test="position()=last()">
      <img src="/images/transparent.gif" width="75" height="1" />
    </xsl:if>
  <xsl:apply-templates/><br />
</xsl:template>
          

Fragment (b) importiert mit poem.xsl das Stylesheet für normal zu behandelnde Gedichte und überschreibt nur, wie einzelne Zeilen behandelt werden sollen. Durch die Abfrage der Position innerhalb einer Strophe (position()=last()) ist hier erreicht, dass vor der jeweils letzten Zeile mit Hilfe eines transparenten Bildchens ein waagerechter Balken eingesetzt wird, der die Zeile um 75 Pixel einrückt.

Wie das Gedichtbeispiel suggeriert, bedeutet ein Import von Stylesheets, dass das importierende eventuell in importierten vorhandene Templates überschreibt. Ein Inkludieren ersetzt das include-Statement schlicht durch den Inhalt des einzubindenden Stylesheets. Für beide Elemente gilt, dass kein Stylesheet sich selbst einbinden darf. Und beim Import von Stylesheet ist zu beachten, dass nicht nur das importierende Stylesheet Vorrang hat, sondern auch eine explizite Ordnung zwischen den Importierten definiert ist.

Importiert ein Stylesheet mehrere andere, die wiederum weitere importieren, gilt zweierlei:

  1. das Prinzip der Tiefensuche: nach einem (importierten) Stylesheet sind erst die wiederum in diesem importierten zu lesen, erst anschliessend die aussr dem ersten importierten
  2. der letzte auf derselben Hierarchiestufe gewinnt

Um es mit dem Beispiel aus der Spezifikation zu sagen: wenn A die Stylesheets B und C importiert (gleiche Hierarchiestufe), B das Stylesheet D importiert und C wiederum E, dann lautet die Vorrangfolge der Stylesheets: A, C, E, B, D.

Dankenswerterweise kann man den Vorrang auch selbst steuern: durch das Element apply-imports. Es bewirkt, dass ein Template mit niederem Import-Vorrang zum Einsatz kommen kann.

Valid HTML 4.01!Valid CSS!