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

7.2 Zugriff auf den Datenbaum

Jede XPath-Konstruktion ist ein Ausdruck (expression), der entweder aus einer Ansammlung von Knoten des Dokuments, einem boolschen Wert, einer Zahl oder einer Zeichenfolge besteht. Der konkrete Zusammenhang (context), innerhalb dessen solche Ausdrücke ausgewertet werden, setzt sich aus dem jeweiligen Knoten (context node), zwei positiven Ganzzahlen, Variablenbindungen, Funktionen und Namensraumdeklarationen zusammen. Was sich hier so kompliziert anhört, ist sicherlich leichter verständlich, wenn man sich die unten stehenden Beispiele ansieht.

XPath-Ausdrücke bestehen aus drei Bestandteilen: einer Achse, einem Knotentest und optionalen Prädikaten. Achsen in den Beispielausdrücken weiter unten sind unter anderem child, descendant, following-sibling und preceding-sibling. Sie beschreiben die Beziehung, die zwischen dem Ausgangsknoten (der gerade durchlaufen wird) und dem gesuchten Knoten besteht. Zwei Doppelpunkte trennen die Achse vom Knotentest (child::absatz), dem jeweils in eckigen Klammern Prädikate folgen können, die die Suche verfeinern. Die folgende Tabelle fasst die Achsen zusammen. Bis auf attribute und namespace gehört zu allen Achsen das Element als Knotentyp.

Achse Bedeutung
child Kindelemente
parent Direkter Vorfahr
descendant Nachfahren
ancestor Vorfahren
following Alle nach dem gegenwärtigen im Dokument vorhandenen Knoten
preceding Alle vor dem gegenwärtigen im Dokument vorhandenen Knoten
following-sibling Geschwister des gegenwärtigen Knotens, die noch folgen
preceding-sibling Geschwister, die vor dem gegenwärtigen Knoten angesiedelt sind
attribute Die Attribute eines Knotens (nur bei Elementen)
namespace Namensraumknoten des gegenwärtigen Knotens (nur bei Elementen)
self Der gegenwärtige Knoten
descendant-or-self Wie descendant, plus der gegenwärtige Knoten
ancestor-or-self Wie ancestor, plus der gegenwärtige Knoten
Die Achsen des markierten Knotens

Abbildung 24: Die Achsen des markierten Knotens

Wenn oben von der Reihenfolge der Elemente die Rede ist, dann im Sinne der zu Anfang des Abschnitts 7.1 beschriebenen Struktur. preceding verweist also auf das Elternelement, während preceding-sibling auf das hierarchisch auf derselben Stufe stehende Geschwisterelement verweist, das in der Reihenfolge vor dem gegenwärtigen Knoten steht.

Für die Ausdrücke von Pfaden hat das Konsortium eine Form vorgesehen, die an objektorientierte Progammierung erinnert: Zwei Doppelpunkte trennen die Achsen vom angegebenen Knoten. Wie die weiter unten folgende Tabelle zeigt, existiert aber auch eine verkürzte Form, die der Notation von Pfaden in der Unix-Welt entspricht.

Ausdruck Zugriff auf
/ Ursprung des Dokumentbaums, nicht das Top-Level-Element des Dokuments
child::* Alle Kindelemente des gegenwärtigen Knotens
child::absatz Alle absatz-Kindelemente des gegenwärtigen Knotens
child::text() Alle Textknoten des gegenwärtigen Knotens
child::node() Alle Kindknoten des gegenwärtigen Knotens
attribute::name Das Attribut name
attribute::* Alle Attribute des gegenwärtigen Knotens
descendant::absatz Alle absatz-Nachfahren des gegenwärtigen Knotens
/descendant::absatz Alle absatz-Elemente in diesem Dokument
/descendant::kapitel/child::absatz Alle absatz-Kindelemente, deren direkter Vorfahr kapitel ist
descendant-or-self::absatz Alle absatz-Nachfahren des gegenwärtigen Knotens oder er selbst (wenn er ein absatz ist)
ancestor::absatz Alle absatz-Ahnen des gegenwärtigen Knotens
ancestor-or-self Alle absatz-Ahnen des gegenwärtigen Knotens oder er selbst
self::absatz Der Knoten selbst, wenn es sich um einen absatz handelt
child::kapitel/descendant::absatz Alle absatz-Elemente der kapitel-Kindelemente
child::*/child::absatz Alle absatz-Kindelemente der direkten Kindelemente des gegenwärtigen Knotens (Enkel-Absätze)
child::absatz[position = 1] Erstes absatz-Kindelement des gegenwärtigen Elements
child::absatz[position = last()] Letztes absatz-Kindelement des gegenwärtigen Elements
child::absatz[position = last() - 1] Vorletztes absatz-Kindelement des gegenwärtigen Elements
following-sibling::kapitel[position() = 1] Das dem gegenwärtigen Knoten nächstliegende Element kapitel (nachfolgend)
preceding-sibling::kapitel[position() = 1] Das dem gegenwärtigen Knoten nächstliegende Element kapitel (vorhergehend)
child::absatz[position() = last()][attribute::typ = "beispiel"] Das letzte Kindelement absatz, wenn es ein Attribut typ mit dem Wert beispiel besitzt
Zugriffspfade lassen sich auch in Kurzform ausdrücken

Diese Liste ließe sich endlos fortführen, aber Beispiele werden in diesem und im folgenden Kapitel noch genügend zu lesen sein. Wichtig ist, und das gilt natürlich auch für die Kurzformen dieser Ausdrücke, dass es wie in Dateisystemen sowohl absolute als auch relative Pfade gibt. Hier wie dortFussnoteWiederum gilt: zumindest unter Unix; denn unter Windows muss es ein rückwärts gerichteter Schrägstrich sein. Vom Macintosh sei hier dezent geschwiegen. benennt der gemeine Schrägstrich den Ursprung des Kontextes, in diesem Fall des Dokuments.

Beispiel

Alles, was mit dem Schrägstrich (/) beginnt, ist absolut:

/child::buch/child::kapitel

beinhaltet alle Kindelemente kapitel eines Wurzelelements buch.

child::buch/child::kapitel

könnte hingegen in einem Dokument, in dem mehrere Bücher als Kindelemente versammelt sind (unterhalb eines anderen, hier nicht bezeichneten Wurzelelements), Zugriff auf alle Kapitel als den Kindelementen von buch zugreifen.

Prädikate wie das in den Ausdruckbeispielen erwähnte [position = last()] produzieren aus dem durchsuchten Knotensatz einen neuen, der nur die Knoten enthält, die den Suchbedingungen entsprechen.

Besonders komplizierte Ausdrücke können die Lesbarkeit deutlich herabsetzen. Möglicherweise haben die Autoren von XPath deshalb eine verkürzte Schreibweise für sie vorgesehen. Dabei ist child die automatisch berücksichtigte Achse, solange keine andere explizit verwendet wird. Die größten Erleichterungen: Wie in Dateisystemen kann man mit . den gegenwärtigen Knoten ansprechen und mit .. den Elternknoten. Anstatt child::* reicht ein einfaches *, um die Kindelemente als gesuchten Knotensatz anzugeben. Außerdem kennzeichnet ein @ das Attribut und //absatz bewirkt durch die führenden Schrägstriche, dass alle Elemente absatz im Dokument dem Auswahlkriterium entsprechen — unabhängig von der Strukturtiefe, in der sie vorkommen.

Vorsicht!

Bei Verwendung von XPath in XSL-Transformationen ist unbedingt zu beachten, dass das <-Zeichen auch bei Größenvergleichen zu maskieren ist: &lt;. Innerhalb von Attributwerten gilt das auch für die einfachen und doppelten Anführungszeichen (&quot; und &apos;). Die folgenden Beispiele sind deshalb XPath-Ausdrücke, kein XSLT.

Ausdruck Zugriff auf
./@thema Attribut thema des gegenwärtigen Elements
../@thema Attribut thema des Elternelements
absatz[24] 24. Kindelement absatz
//absatz[@typ="wichtig"] Alle absatz-Elemente im Dokument, die ein Attribut typ mit dem Wert wichtig haben
absatz[@typ="wichtig"][1] Erstes absatz-Kindelement, das als Attribut typ mit dem Wert wichtig hat
abschnitt[unterabschnitt] Alle abschnitt-Elemente, die ihrerseits über unterabschnitt-Elemente verfügen
abschnitt[ueberschrift and position() < 24] Die ersten 23 abschnitt-Elemente, die eine ueberschrift haben

Valid HTML 4.01!Valid CSS!