 |
66151@usegroup.de Einführung in XML/XSLT Anhang C: Druckversion
Druckversion
|
Druckversion
(Einführung in XML/XSLT)
Version dieses Dokumentes
V1.00 vom 10.7.2001
Was Sie lesen sollten
Wenn Sie zuerst einmal wissen wollen, ob XSLT das Richtige für Sie ist,
oder schnellstmöglichst zuerst einmal eine XML-Datei "hochstellen" möchten, lesen Sie bitte den
Quickstart.
Wenn Sie
- DTDs programmieren möchten, brauchen Sie nur die Datei DTDs zu lesen,
- Schemata programmieren möchten, lesen Sie bitte die Datei Schema und
die ersten 5 Abschnitte der Grundkenntnisse,
- wenn Sie XSLT lernen möchten sollten Sie mit dem Einstieg
anfangen und mit den beiden folgenden Dateien weitermachen, aber unbedingt
wissen, dass die Navigation in einem XML-Dokument
genau behandelt wird,
und die Grundkenntnisse möglichst auch gelesen haben
Lizenz
Copyright (c) 2001 usegroup.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1
or any later version published by the Free Software Foundation;
with the Invariant Sections being Vorwort, with no
Front-Cover Texts, and with no Back-Cover Texts.
A copy of the license is included in the section entitled
"GNU Free Documentation License".
Änderungen an diesem Dokument
Wenn Sie Änderungen an diesem Dokument vornehmen möchten,
lesen Sie bitte model.html.
Links
Im Internet gibt es verschiedene gute XSLT-Seiten wie
Auf viele dieser Ressourcen kann man über die iX-Seiten gelangen.
Empfehlen würde ich auch das Buch XSLT Programmer's Reference von Michael Kay, 777 Seiten, Englisch, 34,99$US von Wrox,
ISBN 1-861003-12-9.
Mehr auf XML-Programmierung und DTDs richtet sich Henning Behme und Stefan Minterts XML in der Praxis,
erschienen bei Addison-Wesley unter der ISBN 3-8273-1636, 512 (deutsche) Seiten für 79,90DM; Auch online
unter www.mintert.com/xml/.
Was ist XML?
XML (eXtensible Markup Language) ist eine Datenbeschreibungssprache.
Das heißt, dass jede Art von Daten (z.B. ein Textverarbeitungs- oder
Tabellenkalkulationsdokument, eine Homepage oder eingeschränkt Grafikdaten
(bislang nur Vektordaten) in einem XML-Format beschreiben lassen).
Sie denselben Vorgänger wie HTML, nämlich
SGML (und sie ähnelt HTML: Tags sollten Ihnen bekannt vorkommen).
Auch definiert XML einen Nachfolger für HTML, XHTML, der gewisse Vor-und Nachteile
hat, doch dazu später.
Hier eine kurze Beschreibung von XML:
-
XML ist an sich keine Dokumentenbeschreibungssprache, sondern eher
eine Dateiformatbeschreibungssprache. Letztendlich könnte ich in
einem XML-Dateiformat alle Aufgaben erfüllen, die ein beliebiges
anderes Dateiformat schon heute erfüllt. Aus einer XMLisierung erfolgen
gewisse Vor-und Nachteilen. XHTML
ist die offizielle XML-Abbildung es HTML-Dateiformates, doch gibt es weitaus
mehr XML-Markup Languages (d.i. Dateiformate) wie z.B. SVG, MathML (Mathematical Markup Language)
und ChemML, (chemical Markup Language) und XSLT.
-
XML definiert die Art und Weise, wie Tags geöffnet und geschlossen werden
können, XML selbst definiert jedoch keine Tags. Bei der Arbeit mit XSLT werden
wir selbsterfundene Tags benutzen (man könnte zwar direkt XHTMl-Tags benutzen
um die eigene Homepage zu schreiben, jedoch bringen "selbsterfundene" Tags, die
mit XSLT in XHTML umgewandelt werden, einen Vorteil: wenn ich einen Tag habe,
der mir sagt, was ein Zitat oder eine Überschrift ist, kann ich für alle
Zitate und Überschriften die Schriftart, Größe, Ausrichtung u.s.w. zentral festlegen).
-
XML hat die Möglichkeit, die Korrektheit von Dokumenten mit sogenannten DTDs und
Schemata testen zu können, jede SVG-Datei kann mit einem XML-Parser überprüft werden,
ob sie syntaktisch und in begrenztem Maße auch semantisch korrekt ist.
-
XML enthält viele Spezifikationen und Erweiterungen wie XPath und XPointer
die aber für
den Durchschnittsprogrammierer nur vom Konzept her interessant sind:
Genaugenommen benutzt zwar jeder XSLT-Programmierer zwangsläufig
XPath, weiß es aber nicht. Um ganz genau zu sein ist die gesamte
Navigation in XML-Dateien die in den Grundkenntnissen
beschrieben sind, XPath.
-
XML-Datenformate sollen auch für Menschen verständlich sein: Auch Vektordaten
aus SVG können dadurch z.B. durch einen Texteditor von Fehlern befreit werden.
in diesem Artikel soll nur gezeigt werden, wie man DTDs und XSLT,
XHTML und Schemata anwendet.
Was ist XSLT?

|
XSLT (eXtensible Stylesheet Language Transformations) ist ein Werkzeug,
von einem XML-Format ins andere zu konvertieren.
XSLT kann z.B. benutzt werden um von einem Eigenformat in eine
XHTML-Datei zu konvertieren. XSLT hat gegenüber CSS den Vorteil, dass
es Transformieren kann, d.h. Elemente mehrmals und an verschiedenen
Positionen verwenden kann (die Tags z.B. von hinten nach vorne zeigen
kann). Richtig vorteilig wirds dann bei Verzeichnissen für Inhalt,
Stichwörter und Bilder: XSLT kann sich die entsprechenden Informationen
aus den Dateien nehmen und automatisch ein Inhaltsverzeichnis
aufstellen (so geschehen in index.html).
Die Trennung von Struktur und Inhalt
HTML war von Anfang an dazu gedacht, zu definieren, welche Stellen im Dokument
z.B. Überschriften sind und welche betont werden sollen.
Der Browser entschied, wie die Dokumente darzustellen waren - und
hat aber wirklich Jeden, der entfernt was von Design verstand ziemlich die Wände hochgehen
lassen (die Seiten sahen selten auf zwei Browsern gleich aus).
Sehr spät hat das W3C seinen Fehler eingesehen hat und den Benutzern mit CSS ein Werkzeug an die
Hand gegeben hat um das Aussehen ihrer Seiten genauer und Browserunabhängig festlegen zu können.
Nichtsdestotrotz haben sich die Entwickler von großen Seiten ein
Beispiel an dem tollen WYSIWYG (What You See Is What You Get, also
dem gleich-aussehen des Ergebnisses mit der Anzeige in der Arbeitsumgebung)
genommen, dass viele Seiten mehr oder weniger eingefroren sind.
Ich habe zum Beispiel an einem Projekt konventionell mitarbeiten
müssen, das aus je 200 Dateien in 7 Sprachen bestand.
An sich ist das
noch kein Problem, nur wenn Optik oder Inhalt geändert werden sollen
(und sie sollten), sind
oft redundante Arbeiten auszuführen (an denselben Tags in
verschiedenen Dateien etwas ändern) oder die Änderungsstellen werden schwer
gefunden.
Dagegen hilft eine weitere Schicht, die Strukturschicht.
Ich definiere also selbst Tags die beschreiben, welche Information
mit der Absatz liefert und später sage ich wie diese Information(en)
dargestellt werden sollen.
Inhalt (z.B. Dies ist ein Artikel über XML).
Struktur (<Artikelanfang>Dies ist ein <Stichwort>Artikel über XML</Stichwort> <Artikelende>)
Darstellung: Stichwörter unterstreichen.
Ergebnis: Dies ist ein
Artikel über XML
Wenn ich jetzt 10000 HTML-Seiten schriebe und plötzlich auf die Idee käme,
Stichwörter entsprechend irgendeiner Norm blau zu schreiben, wäre
das durch die (einmalige) Änderung der Darstellungsschicht erheblich
leichter als durch eine Änderung von 10000 HTML-Dateien.
Das ist ein Grund, warum XSLT genial ist - und auch der Grund, warum
es erst ab einer gewissen Projektgröße beziehungsweise
Änderungshäufigkeit Sinn macht. Die Strukturschicht zwingt zu
einem leichten Mehraufwand - der Definition, welchen Zweck ein Abschnitt
entpricht und der späteren Definition, wie dieser darzustellen ist.
Sinn macht XSLT allerdings auch dann, wenn ich darauf angewiesen bin,
die Dateien z.B. in verschiedenen XML-Formaten weiterzugeben.
Ein weiterer Punkt ist: Wenn man in einem Team arbeitet und sich geeinigt
hat, welche Inhalte beschrieben werden (man sich also auf alle Tags und
Attribute geeinigt hat), kommt man i.d.R. mit einem sehr groben
Arbeitslayout aus und die Gruppen können gleichzeitig am Layout
(sprich der XSLT-Datei), an der DTD (falls gewünscht) und am Inhalt arbeiten.
Was ist XHTML?
HTML ist einne Untermenge des SGML-Dateiformat (Standard Generalized Markup Language).
XML ist eine kleinere Untermenge der SGML-Möglichkeiten und
XHTML ist ein XML-Dateiformat.

Vorteile:
- Die X(HT)ML-Eingabe kann durch DTDs und Schemata geprüft werden
- Der Standart ist klar definiert und kann durch Namespaces ausgeweitet
werden: Eine Kontrolle des Standarts ist gegenüber HTML möglich und auch gegeben
(keine nur-auf-Netscape-laufenden Erweiterungen mehr)
- Es ist in XSLT leichter und sinnvoller, eine XHTML-Datei als eine HTML-Datei
zu definieren
- Die X(HT)ML-Eingabe kann durch XSLT in andere Formate portiert werden
- Es ist wesentlich einfacher, einen XHTML-Browser als einen HTML-Browser
zu schreiben
Nachteile:
- HTML-Editoren und Programmierer müssen umlernen
- Da HTML de facto weiter besteht werden die Browser aufgebläht
- Es ist bisher kaum verbreitet
- Es ist länger als HTML
Alle HTML-Dateien dieses Projekts sind übrigens XHTML.
Das hat den Grund weil sie per XSLT aus einem proprietären
XML-Format erzeugt wurden.
Was sind DTDs?

|
DTD (Document Type Definitions) sind Dateien die beschreiben,
welche Tags mit welchen Attributen an welchen Stellen eines bestimmten
XML-Formats erlaubt sind. Da die Korrektheit der Tags ganz erheblichen
Einfluss darauf hat, ob die Dateien überhaupt angezeigt werden können,
gibt es für fast jedes XML-Format ein DTD oder Schema (mehr dazu gleich).
Auch sind sie eine wertvolle Hilfe beim Debugging und
beim Schreiben (Emacs mit DTD-Unterstützung zeigt zum Beispiel
alle Tags die im aktuellen Kontext verwendet werden dürften).
DTDs werden vom XML-Parser verarbeitet und können den Anwender
z.B. mit Fehlermeldungen wie "Tag unknown in line 44" weiterhelfen.
DTDs haben einen Haken: Sie können keine Datentypen überprüfen.
Das Tag Kundennummer kann letztendlich nur als Zeichenfolge
(PCDATA) deklariert werden,
sollten Kundennummern etwa mit Buchstaben oder Sonderzeichen vorkommen,
muss jeder (bzw. jedes Programm das es anzeigen soll) selbst sehen,
wie er zurecht kommt ;(
Dieses Manko beheben XML Schemata die seit dem 24.10.2000
W3C-Empfehlung sind.
Was sind Schemata?
Schemata sind Dateien, die ähnlich wie DTDs die Gültigkeit eines
Dokuments beschreiben. Anders als diese arbeiten Schemata jedoch nicht
Dokumenten- sondern Datenorientiert, kennen also verschiedene
Datentypen. Mit Schemata können Sie z.B. vorgeben,
dass ein Attribut nur eine Postleitzahl und ein Element nur eine
Artikelnummer beinhalten darf. Sie können dann die Datentypen
Postleitzahl z.b. als fünfstellige Nummer definieren und
Artikelnummer aus einer Folge dreier Buchstaben, einem Bindestrich
und 4 bis 5 Zahlen.
Der Vorteil: Werden die XML-Daten maschinell ausgewertet können
Fehler der Eingabe schon früh vermieden werden. Teilweise kann
sogar ganz auf eigene Überprüfungsroutinen, z.B. ob das Element
eine Zahl ist, verzichtet werden.
XSLT-Quickstart
Hier die Schritte wie Sie ein XSLT-Projekt ins Netz bekommen:
- Schreiben Sie Ihre XML-Datei in einem beliebigen Editor, Beispiel
- Schreiben Sie Ihre XSL-Datei in einem beliebigen Editor, Beispiel
- Konvertieren Sie die XML-Datei mit der XSL-Datei und einem XSLT-Prozessor wie Saxon
in XHTML (bei Instant Saxon lautet der Aufruf z.B. saxon -a -o htmldatei.html xmldatei.xml)
- Stellen Sie die XHTML-Datei ins Netz, Ergebnis des Beispiels
- DTDs und Schemata zu verwenden machen dann Sinn, wenn z.B. eine
Personengruppe an den XML-Dateien arbeitet:
ein DTD oder ein Schema würde dann z.B. verhindern, dass die XML-Datei nicht mehr nach den Regeln der
XSL-Datei interpretiert werden kann. Falls Sie ein DTD oder ein Schema haben wird Schritt 1 davon unterstützt,
wenn Sie einen XML-Editor benutzen.
Beim Schreiben der XML-Datei müssen Sie entweder nach einem gewissen DTD oder Schema handeln, wenn Sie
ein schon bestehendes XML-Format umwandeln möchten, oder Sie können sich eigene Tags ausdenken - für
die Sie dann ein DTD oder Schema schreiben können und vor allem eine XSL-Datei (sprich
XSLT-Transformation) schreiben sollten.
Als Ausgabe muss nicht XHTML erfolgen, alle anderen XML-Formate (SVG, MathML, DocBookXML, viele andere
oder wiederum ein selbstdefiniertes Format sind möglich).
Eine Konvertierung in HTML kann unnötig sein wenn Ihr Browser XSLT unterstützt
(dann stellen Sie einfach die XSL-Datei und die XML-Datei online und sprechen die XML-Datei an).
Der Microsoft Internet Explorer tut das ab 5, Mozilla ab 0.91 (entspricht Netscape ab 6.1 Preview).
Das ist jedoch selten mehr als ein theoretisches Feature, z.B. unterstützt IE nur sogenanntes
MSXML, also kein XML nach W3C; auch stellt Mozilla 0.91 das Tutorial nicht korrekt dar.
Zur Programmierung des IE-XSLT-Parsers siehe
SelfXML.
Das ist auch der Grund, warum alle XML- und XSL-Dateien im Sample/-Verzeichnis aus diesem Text
als .xml.txt bzw. .xsl.txt angesprochen werden (im Samples-Verzeichnis liegen auch die
Originaldateien): um sie in einem Editor laden zu lassen -
der Internet Explorer stellt sie wie gesagt nicht korrekt
dar, obwohl er und Netscape ab 6.1 eigentlich auch XSLT-Transformationen übernehmen sollten...
Was Sie erwartet
In dieser Datei werden XML-Begriffe geklärt und
die Navigation in einem XML-Dokument aufgezeigt. Diese Navigation
sollte Ihnen bei den XSLT-Kapiteln besonders hilfreich sein.
well-formed
Ein Document ist dann "well-formed", also als XML zu erkennen wenn es den XML-Gesetzen in der Weise
gehorcht, dass
- Es keine ungültigen Zeichen beinhaltet
- Es keine Zeichen ausserhalb von Tags oder Attributen beeinhaltet
- Jedes Tag geschlossen oder in Kurzform geschlossen ist (kurzform: <tag/>)
- Es genau ein Top-Level-Tag besitzt
- Di Schachtelungen der Tags "sauber" ist, also jedes Tag geschlossen ist bevor sein Vatertag
geschlossen wird (falsch: z.B. <topl>Dies ist ein <b>fetter <i>kursiver</b> Text</i></topl>)
- Alle Attribute in Hochkommas eingeschlossen sind
- Keine Attribute unmaskierte spitze Klammern besitzen (<>)
- Jeder Attributname in einem Tag nicht öfter als einmal vorkommt
- Es einen Header besitzt (z.B. <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> )
valid
Ein Dokument ist dann valid, also gültig, wenn es wellformed ist
und dem DTD und/oder dem Schema gehorcht,
der/das/die im Dateikopf angegeben wurde/n. (Ein Dokument kann sowohl
einem DTD als auch einem Schema gehorchen müssen)
Import-Präzedenz
Sollte zwei gleichermaßen zutreffende Tags gefunden werden,
<!-- für Tag b ist definiert -->
<xsl:template match="b">
Wird angewendet
</xsl:template>
<!-- und -->
<xsl:template match="u|i|b">
Wird in dem Fall für b nicht angewendet
</xsl:template>
entscheidet die Import-Präzedenz darüber, welches Template
zur Ausführung kommt. Das ist in der Regel das oberste, wobei
bei eingebundenen (xsl:include) oder importierten (xsl:import)
Templates das Importierte gegenüber dem in der Datei
definierte immer das Nachsehen hat.
Wenn Sie z.B. an einer Stelle hinter einem
<xsl:template match="bsp">
<b>
<xsl:apply-templates/>
</b>
</xsl:template>
ein Include oder Import verwenden, die ebenfalls für bsp eine
Transformation z.b. als kursiv definieren, wird bsp trotzdem
immer nur fett angezeigt. Wenn Sie in einer anderen Datei
zuerst ein Import ausführen das bsp kursiv macht und dann
ein Include, das es fett mcht, wird es wiederum fett,
weil Include eben eine höhere Präzedenz hat.
Namespaces
Namensräume (Namespaces) sind die XML-Empfehlun wie man verschiedene
XML-Formate in einem Dokument verwenden kann (man schreibt
einfach den Namespace prefix, z.b. xsl mit einem Doppelpunkt
vor das verwendete Kommando).
Der Eintrag in einer XSL-Datei
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">
Bedeutet z.B. der Namespace xsl (xmlns:xsl) wird
für XSLT-Befehle benutzt. Theoretisch ist auch ein anderer
Wert als XSL möglich, dann müssten die Befehle auch anders aufgerufen werden
(anstelle xsl:apply-templates z.b. xslt:apply-templates).
XSL ist allerdings für den XSLT-Namespace zu einem de-facto-Standard
geworden.
Navigation im XML-Dokument
Eine XML-Datei wird oft mit einem Baum verglichen,
wobei jedes Tag einen weiteren Ast vom aktuellen Ast abspaltet
abspaltet - der wiederung weitere Äste haben kann.
Die Wurzel, also das höchste Tag und gleichzeitig der
erste Ast ist /.
Die Elemente werden ähnlich wie Verzeichnisse auf einem Linux-Computer
angesprochen (Unterschiede zu Windows-Verzeichnissen: es wird auf
Groß/Kleinschreibung geachtet und man trennt nicht durch \ sondern durch /).
Man kann alle Elemente absolut und lokal ansprechen.
/datei/abschnitt/satz spricht z.B. nur die Berliner an:
<datei>
<satz inhalt="kein berliner">
Ich bin kein Berliner
</satz>
<abschnitt>
<satz inhalt="berliner">
Ich bin ein Berliner
</satz>
<satz>
Ich bin auch ein Berliner
</satz>
</abschnitt>
</datei>
Außerdem ist es möglich, gezielt jedes Vatertag anzusprechen
(siehe z.B. Parent),
das bestimmten Bedingungen genügt, jedes Kind-Tag usw..
Ein möglicher Stammbaum an dem man die Bennenung der Elemente
sehr gut ersehen kann ist:
//
//satz spricht jeden Satz, egal in welchem Tag an, also alle drei Sätze.
|
Der vertikale Strich bedeutet soviel wie ein "oder". Um im Beispiel
zu bleiben bedeutet ein satz|abschnitt, dass sowohl Sätze,
als auch Abschnitte mit diesem Template behandelt werden
(passt zu Satz oder Abschnitt).
.
Der Punkt spricht das lokale Element an. Bsp:
<xsl:value-of select="."/>
gibt das lokale Element aus.
@
Der Klammeraffe spricht die Attribute an, /datei/satz/@inhalt z.B.
"kein Berliner". Beim lokalen Element reicht "@attributname", ein
Punkt ist hier nicht nötig.
@*
Bedeutet: Selektiere sowohl alle Attribute als auch den Taginhalt.
Praktisch ist das z.B. beim Kopieren von Elementen.
self::tagname
Entspricht dem Tagnamen des aktuell selektierten Elements.
<xsl:apply-templates select="*[not(self::s)]"/>
Wendet alle Templates an, die nicht den Tag "s" verarbeiten.
preceding-sibling::
Wählt das vorhergegangene gleichrangige (sibling=Geschwister)-Tag aus.
<xsl:apply-templates select="*[not(preceding-sibling::s)]"/>
Wendet alle Templates auf Tags an, die nicht NACH den Tag "s" verarbeitet werden.
following-sibling::
Wählt das nachkommende gleichrangige (sibling=Geschwister)-Tag aus.
<xsl:apply-templates select="*[not(following-sibling::s)]"/>
Wendet alle Templates auf Tags an, die nicht VOR den Tag "s" verarbeitet werden.
parent::
Wählt das Tag eine Ebene höher aus.
<xsl:apply-templates select="*[not(parent::s)]"/>
Wendet alle Templates auf Tags an, die nicht als direktes Kind zu einem "s"-Tag
definiert wurden.
Wollen Sie ein Attribut des höheren Tags ansprechen, sollten Sie
../@ATTRIBUTNAME verwenden.
ancestor::
Wählt das Tag mindestens eine Ebene höher aus.
<xsl:apply-templates select="*[not(ancestor::s)]"/>
Wendet alle Templates auf Tags an, die nicht als direktes Kind zu einem "s"-Tag
oder einem dessen Untertags (... den Untertags der Untertags ...)
definiert wurden.
child::
Wählt das Tag eine Ebene tiefer aus.
<xsl:apply-templates select="*[not(child::s)]"/>
Wendet alle Templates an, die nicht ein direktes "s"-Tag
als Kind haben.
descendant::
Wählt das Tag mindestens eine Ebene tiefer aus.
<xsl:apply-templates select="*[not(descendant::s)]"/>
Wendet alle Templates an, die nicht ein "s"-Tag
als Kind oder Kind eines Kindes (...) haben.
XHTML
Um von HTML auf XHTML umzusteigen, müssen Sie folgende Dinge beachten:
- Tags und Attributnamen müssen in Kleinbuchstaben geschrieben werden
- Die Datei muss sollte mit <?xml version="1.0" encoding="ISO-8859-1"?> beginnen und muss
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
beinhalten
- alle Tags müssen geschlossen sein, z.B. <br></br> (entspricht der Kurzform <br/>)
- alle Attributwerte müssen in Hochkomma eingeschlossen sein
- keine Attributminimierung mehr! Es gibt jetzt für jede Minimierung eine Alternative, aus <hr
noshade> wird z.B. <hr noshade="noshade"/>
- auch in Javascript müssen nun die Elemente & und < maskiert
werden als & bzw. <
- Keine Elementschachtelungen über das Vaterelement heraus!
<b>fetter <i>fett-kursiver</b> kursiver</i>
Text ist jetzt streng verboten, weil man sowas nie in einem Baum
darstellen oder verarbeiten könnte. Benutzen Sie <b>fetter
<i>fett-kursiver</i></b><i>
kursiver</i>
- Folgende Tags können nun, dürfen aber nicht in folgenden anderen enthalten sein:
| a |
darf kein weiteres a enthalten |
| pre |
darf kein img,object,big,small,sup,sub enthalten |
| button |
darf kein input, select, textarea, label, button, form, fieldset, iframe, isindex |
| label |
darf kein weiteres label enthalten |
| form |
darf kein weiteres form enthalten |
- <p name=""> heißt jetzt <p id>
XHTML-Tags
Die folgenden Tags sind in XHTML 1.1 definiert:
|
Anwendung
|
Tag
|
|
Text
|
a, abbr, acronym, address, b, big, blockquote, br, cite, dfn, div, em, h1, h2, h3, h4, h5, h6, hr, i, kbd, p, pre, q, quote,
samp, span, small, strong, sub, sup, tt, var
|
|
Formulare
|
button, fieldset, form, input, label, legend, option, optgroup, select
|
|
Tabelle
|
caption, col, colgroup, table, tbody, td, tfoot, th, thead, tr
|
|
Listen
|
dl, dd, dt, ol, ul, li
|
|
Bilder
|
img
|
Wer suchet, der nicht findet: blink ist Gott sei Dank schon lange
verschwunden (genaugenommen nie aufgetaucht),
font und center gibt es nicht mehr: Diese soll man durch entsprechenden
Einsatz von div ersetzen (<center> durch <div align="center">Text</div>,
font z.B. durch <div style="color:#ff0000; font-size:12pt">).
Grund: Es waren keine vom W3C definierte Tags und Sie beschrieben auch nicht
die Struktur (wie z.B. cite), sondern die Darstellung. Dafür hat das W3C
allerdings CSS gelauncht.
Die Liste ist übrigens wahrscheinlich unvollständig; wichtige Tags wie img und a fehlten.
Was ist DocBook?
Docbook ist ein
SGML-Format, das für Veröffentlichungen bestimmt wurde. Es gibt jedoch ein XML-Format, DocBook/XML. Wie Sie aus dem Vorwort wissen sollten, ist XML eine Teilmenge von SGML, Docbook/XSL ist jedoch nicht notwendigerweise eine Teilmenge von Docbook
(Sie können alles machen, was Sie mit Docbook/SGML auch können, nur machen Sie einige Dinge anders). Zur Verdeutlichung der
Beziehung von SGML und XML hier ein Diagramm
.
Warum der Name?
Der Name Docbook ist aus folgenden Gründen
sinnvoll:
- Es handelt sich um ein Format, das auch gut dafür verwendet werden kann, technische Dokumentationen zu erstellen
- Durch die Untersttzung von DTP-Programme wie Framemaker kann man Docbooks tatsächlich relativ einfach als Buch veröffentlichen
lassen
nicht sinnvoll:
- Man kann Docbook nicht nur verwenden, um ganze Bcher zu definieren,
sondern auch für kleine Artikel (Die Linux-howtos werden z.B. aus Docbook generiert).
- Auch sind die entstandenen Dateien vielseitig verwendbar nicht nur, um Bücher zu drucken, sondern auch, um zum Beispiel XHTMLs oder PDFs zu erstellen.
Was ist XML:FO
XML:Formatting Objects ist ein vom W3C abgesegnetes XML-Dateiformat, das für Print-Medien optimiert wurde. Anders als in den meisten anderen XML-Formaten, deren
Tags sagen, was ein Element ist, und nicht wie es dargestellt werden soll, befassen sich die Tags von XML:FO ausschlie�ich
damit, wie die Elemente auf Print-Medien darzustellen sind. XML:FO-Prozessoren wie der Apache FOP generieren daraus dann Druckvorstufen, der Apache FOP beherrscht z.B. auch PDF. Wir werden die XSLT-Transformationen von Docbook auf XML:FO benutzen, um ein PDF zu erstellen, und die von Docbook auf XHTML um eine XHTML-Seite zu erstellen.
Ein Testsystem
Um anständig mit Docbook/XML arbeiten zu können empfehle ich Ihnen folgende Dateien:
Ein Beispiel-Buch
Wählen Sie in Ihrem XML-Editor "neues Dokument" basierend auf der Docbook DTD (je nachdem wohin Sie sie entpackt haben).
In XML-Spy bevorzuge ich die Textansicht
.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE set SYSTEM ".\dtds\docbookx.dtd">
<set>
<book>
<chapter>
<title>Mein erstes Kapitel</title>
<para>Hier ist ein Absatz</para>
<sect1>
<title>Ein Abschnitt im Kapitel</title>
<para>Mindestens ein Absatz im Aschnitt macht ihn DTD-Gerecht.</para>
</sect1>
</chapter>
</book>
</set>
Quelle: Mark Galassi's DocBook/SGML-Tutorial
Bilder in Docbook
Eine Möglichkeit, Bilder einzubetten, besteht in der Kombination aus
inlinemediaobject, imageobject und imagedata. Wie der Name schon sagt,
wird das Bild dann inline, also ohne Umlauf oder Ausrichtung eingebaut.
<inlinemediaobject>
<imageobject>
<imagedata fileref="dateiname.jpg" format="JPG"/>
</imageobject>
</inlinemediaobject>
Zeilenumbruch (Breaks) erzwingen
Normalerweise wird man Zeilenumbrüche in Docbook durch Absätze
(<para>...</para>) herbeiführen. Diese werden in
HTML jedoch sinnhafterweise mit <p>...</p> übersetzt,
einen einfachen Zeilenumbruch, sprich etwas, was die Ausgabe eines
<br/> in der HTML-Ausgabe erzeugt, ist nur durch die Verwendung
von Literallayout möglich. Um Literallayout anwenden zu können, müssen
zunächst alle Absätze beendet werden. Das Literallayout ist dabei in etwa vergleichbar mit dem
HTML-Preformatted-Tag <pre>...</pre>: Ein Zeilenumbruch in der Quelldatei führt
zur Erzeugung eines Zeilenumbruchs in der Ausgabe.
<para>
Ein Absatz ohne Zeilenumbruch
</para>
<literallayout>
Ein Absatz mit Zeilen-
umbruch
</literallayout>
<para>
Ein weiterer Absatz ohne Zeilenumbruch
</para>
Links
Links werden in DocBook mit ulink realisiert.
<ulink url=âhttp://www.google.deâ> Linktext </ulink>
Kursiver Text
Text können Sie kursiv darstellen, wenn Sie das emphasis-Tag mit der kursiven "role" verwenden.
<emphasis role="italic">italic emphasized</emphasis>
Fußnoten
Verwenden Sie footnote im Text um an der entsprechenden Stelle eine Fußnote einzufügen.
Darin sollten Sie Text als Absatz (para) formatieren.
<footnote id="fnid1"><para>A footnote</para></footnote>
Metadaten über Artikel
Als per <set>-<book> als ganzes Buch auszuzeichnen können Sie auch
den leichtgewichtigeren article verwenden:
Artikel können (oder sollten) mit Metadaten ausgezeichnet werden,
vom Titel über Datum und Autor bis hin zu Stichwörtern, die in
einer subjectset-subject-subjectterm-Konstellation angegeben werden können.
<article>
<articleinfo>
<title>XYY</title>
<corpauthor>usegroup</corpauthor>
<date>2005-04-04</date>
<subjectset>
<subject>
<subjectterm>
Others
</subjectterm>
</subject>
</subjectset>
</articleinfo>
<para>
Ein Abschnitt
</para>
</article>
Export als XHTML
Wenn Sie diese Datei möhten z.B. als XHTML ins Netz stellen möchten,
müssen Sie zuerst einmal einfgen, dass das entsprechende XSL-Stylesheet
verwendet werden soll.
Mit dem Befehl
saxon -o index.html docbook.xml html/docbook.xsl
erstellen Sie dann aus der Docbook.xml mithilfe den Style Sheets in html/docbook.xsl die Index.html. Anstelle html/docbook.xsl
können Sie
natrlich auch IhrenPfadZuDenStyleSheets/html/docbook.xsl angeben,
nur sollten Sie bei diesem Pfadnamen gnädigerweise auf Abstände verzichtet haben.
Export als PDF
PDFs bekommen Sie aus einem Docbook, indem Sie zuerst eine Ausgabe in XML:FO erstellen:
saxon -o index.fo docbook.xml fo\docbook.xsl
Und an die PDF-Datei kommen Sie dann ganz einfach mit einem FO-Prozessor dran:
fop index.fo index.pdf
Interessanterweise bringt ebendiese Zeile bei meinen 1.50ern Style Sheets
die Meldung
[Error]: The id "toc...d47e3" already exists in this document
Was sich aber umgehen lässt indem man eine der beiden "toc...d47e3"s in einen
anderen Wert, z.B. "toc...d47e4" ändert.
Dann ist auch die PDF-Datei größer als 15 Bytes und lässt sich lesen.
Das scheint nebenbei ein Problem im FOP-Prozessor und nicht in der Transformation
zu sein. Lars Trieloff
(http://trieloff.net/docbook/distfiles/XML-Flatener/superfop.jar, danke für den Hinweis) bietet eine gepatchte FOP-Version.
Kommentare
Kommentare werden in XSLT geschrieben als
<!-- Kommentar -->
Diese Kommentare werden i.d.R. nicht in die Ausgabe übernommen,
möchten Sie (z.b. für eine leichtere lesbarkeit) Kommentare
in den erzeugten HTML-Text schreiben, müssen Sie die Kommentare
in ein xsl:comment-tag einbetten.
<xsl:comment>< Kommentar, der übernommen wird ></xsl:comment>
xsl:text
Der gesamte Text in der XSL-Datei, der ausgegeben werden soll,
müsste streng genommen in xsl:text - Tags stehen.
Genaugenommen wird er aber auch ausgegeben, wenn er nicht in diesen Tags steht.
xsl:template
*name
Ein Template (zu deutsch: Vorlage) ist das zentrale Element in XSLT:
dort werden alle Tagumwandlungen und Positionierungen vorgenommen.
Beispiel: samples/xslt1.xml und
samples/xslt1.xsl.
--- datei xslt1.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet href="xslt1.xsl" type="text/xsl"?>
<hello-world>
Hallo Welt!
</hello-world>
--- datei xslt1.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="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Daraus können Sie z.B. mit "saxon -a -o xslt1.html xslt1.xml"
eine HTML-Datei erstellen wenn Sie
Instant Saxon
benutzen.
Erklärung:
xsl:template match="/" wählt sich das tiefste Tag (hello-world), gibt
zuerst einmal <html><body> aus und
"wendet die Templates an". Danach wird noch </body></html> ausgegeben
und die Transformation beendet.
Templates anwenden heißt, dass alle Kind-Tags ausgewertet werden und
Text innerhalb des Tags geschrieben wurde, ausgegeben wird.
Sollte ein Kind-Tag nicht definiert sein, wird
auch dessen Inhalt als Text ausgegeben, das Tag selbst wird jedoch nicht
mehr in der Ausgabe stehen.
Apply-Templates ohne passende Templates
So wird auch bei folgendem Beispiel (sample/xslt2.xml) das
"undefinierte" Tag b nicht
übergeben, der Text nicht fett dargestellt, weil XSLT nicht wissen kann,
dass b als Tag so erhalten bleiben soll.
Hallo <b>Welt</b>!
Ein anderes Tag matchen
Mit einem zweiten xsl:template-Tag können wir auch beliebige andere
Tags bearbeiten - z.B. können wir ein b-Tag kapseln
(samples/xslt3.xml und samples/xslt3.xsl)
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="b">
Fett:<b>
<xsl:apply-templates/>
</b> und wieder normal:
</xsl:template>
Achten Sie immer darauf, in der XML-Datei die gewünschte XSL-Datei anzupassen.
Die Navigation im XML-Dokument ist im Artikel Grundkenntnisse
geklärt - die dortigen XPath-Anweisungen werden Ihnen bei select- und match-
Attributen eine wertvolle Hilfe sein.
xsl:value-of
select
Neben der schon erwähnten Methode
xsl:apply-updates
kann man den Inhalt eines Tags durchaus auch mit value-of
(xsl:value-of select="..."
) ausgeben. Bei der Ausgabe des aktuellen
Taginhaltes in einem Template kann man z.B. <xsl:value-of select="."/>
verwenden.
Der Nachteil: Der Inhalt des Tags wird nicht ausgewertet, sollten also
Tags geschachtelt sein <body> Hallo <b> Welt </b> </body>
würde man bei einem <xsl:value-of select="/body"/> ein Hallo <b> Welt </b> sehen,
auch wenn man an anderer Stelle die Behandlung von b-tags definiert hat.
xsl:value-of
select
Attribute werden in XSLT grundsätzlich mit tagname/@attributname angesprochen,
z.B. img/@src für das src-Attribut eines img-Tags. Mit
<xsl:template match="img">
Bild: <xsl:value-of select="@src"/>
</xsl:template>
kann man dann den Namen eines Bildes ausgeben.
Kurzform einer Ausgabe
Erfolgt die Ausgabe innerhalb von Attributen
kann man anstelle eines value-ofs eine geschweifte Klammer verwenden.
Siehe xslt4.xsl und xslt4.xml.
<xsl:template match="img">
<img src="{@src}" alt="{@alt}"/>
</xsl:template>
Ist etwas eleganter als die längere Lösung (Ein kleiner Tipp: Sie
könnten gar nicht <img name="<xsl:value-of select="."/>"/>
verwenden weil Tags grundsätzlich beendet (nicht geschlossen) sein
müssen wenn man eine XSL:value-of-Ausgabe anfängt.
Sie müssten mit <xsl:element> arbeiten).
Bedingungen
Mit xsl:if können Sie überprfen, ob Variablen, Funktionen, Tags
oder Attribute einen bestimmten Wert haben.
Siehe auch when
Ein definiertes Tag oder Attribut hat z.B. immer den Wert true, so gibt
<xsl:if test="@name">
Name des Bildes: <xsl:value-of select="@name"/>
</xsl:if>
Name des Bildes: auch wirklich nur dann aus, wenn auch ein solcher
Name definiert wurde.
<xsl:if test="position()!=last()">
<a href="#top"><img src="nachunten.gif"/></a>
</xsl:if>
gibt nur bis zum vorletzen Vorkommen des Tags nachunten-Bilder aus.
das fehlende xsl:else
Es gibt in XSLT ein else, nur heißt es xsl:otherwise und funktioniert
nur in xsl:choose-tags.
case
xsl:choose ist in etwa mit einem case einer normalen Programmiersprache vergleichbar.
Alle when-und otherwise Tags müssen in einem xsl:choose Tag gekapselt sein.
<xsl:choose>
<xsl:when test="state='AZ'">Arizona</xsl:when>
<xsl:when test="state='CA'">Kalifornien</xsl:when>
<xsl:when test="state='DC'">Washington DC</xsl:when>
<xsl:otherwise><xsl:value-of select="state"/></xsl:otherwise>
</xsl:when>
</xsl:choose>
xsl:when
Änlich if, darf aber nur in einem choose-Tag vorkommen und ein otherwise (entspricht else) ist möglich.
Beispiel siehe xsl:choose
xsl:otherwise
Entspricht in etwa else einer Programmiersprache oder einer Default-Einstellung.
xsl:for-each
select
xsl:for-each ist ein sehr praktisches Tag, weil es erlaubt, alle Tags eines
bestimmten Types im aktiven Template auszugeben und zu bearbeiten.
Daher ist es z.B. fr Inhaltsverzeichnisse und Stichwortlisten pr�estiniert.
<xsl:for-each select="//cue">
<a href="{.}"/><xsl:value-of select="@name"/></a>
</xsl:for-each>
findet alle (// entspricht an jeder Position des Dokuments) cues des Dokuments und gibt sie mit Namen aus.
Ein interessanter Nebeneffekt ist, dass es das Element (sofern eins angegeben) in select
zum aktiven Knoten macht, im Beispiel wird also jeder //cue nacheinander zum aktiven Element,
sodass "." und "@name" die entsprechenden Inhalte haben und nicht wie
<xsl:for-each select="//cue">
<a href="{//cue}"/><xsl:value-of select="//cue/@name"/></a>
</xsl:for-each>
geschrieben werden mssen - das auch eine ganz andere Bedeutung hätte (select="//cue/@name" würde z.B.
wieder den alle Namen-Attribute aller cues ausgeben).
Weil es den aktiven Knoten wechselt, verwenden einige sogar ein xsl:for-each auf ein Statement,
das nur ein einziges Element erzeugt, eben um relativ adressieren zu können.
Sortieren
select, *order, *case-order, *lang, *data-type
xsl:sort ist als Kindelement zu for-each und apply-templates zugelassen. Es sortiert die Ausgabe
nach dem in select angegebenem Attribut
<xsl:for-each select="document(@fname)//cue">
<xsl:sort select="@name"/>
<xsl:value-of select="@name"/>-<xsl:apply-templates/><br/>
</xsl:for-each>
order kann "ascending" oder "descending" sein, case-order "lower-first" oder
"upper-first".
lang setze ich gewohnheitsmäßig auf "de", was die
deutsche Sortierreihenfolge anwenden sollte, bei Saxon aber nichts
ädert. Laut Michael Kay ist die Sortierreihenfolge für
modernes deutsch übrigens aäbcdefghijklmnoöpqrstuüvwxyz
anstelle - wie zumindest noch in meinem Telefonbuch - ä bei
ae einzuordnen. Nebenbei sei die Reihenfolge im Schwedischen ä�nach z.
data-type kann "text", "number" oder ein QName sein was bestimmt ob die
Werte dem Alphabet oder Nummern oder einem selbstdefinierten Datentyp
zugeordnet werden.
Sortiert xsl:sort nicht die Ausgabe, sondern die Eingabe, also die
Reihenfolge in der die Elemente verarbeitet werden.
<xsl:sort select="position()" data-type="number" order="descending"/>
wendet die Templates in entgegengesetzter Reihenfolge zu der, in der
sie im Dokument definiert sind, an.
Eine Sortierung z.B. nach Alter und Name kann durch zwei sorts hintereinander
erreicht werden.
<xsl:for-each select="//person">
<xsl:sort select="@alter"/>
<xsl:sort select="@name"/>
<xsl:value-of select="@alter"/>, <xsl:value-of select="@name"/><br/>
</xsl:for-each>
das fehlende xsl:while
Da es in XSLT nicht m�lich ist, Variablen zu modifizieren, gibt es auch kein while, weil sich keine
Bedingung jemals ändern könnte. Es ist allerdings möglich, templates rekursiv so aufzurufen, dass sich de
facto ein while realisieren lässt.
xsl:variable
name *select
Die Auswertung von select oder der Inhalt wird in der Variable gespeichert.
Variablen werden mit $ angesprochen.
<xsl:variable name="lastnode" select="last()"/>
<xsl:if test="position()=$lastnode">
Last node for the turn...
</xsl:if>
<xsl:variable name="decision">
<xsl:if test="position()=1">
First node for the turn...
</xsl:if>
<xsl:if test="position()=last()">
Last node for the turn...
</xsl:if>
</xsl:variable>
Diese Variable hat entweder den Inhalt First node for the turn oder Last node for the turn.
Geltungsbereich:
Werden Variablen innerhalb eines Elements wie template, if, for-each o.ä. definiert,
gelten Sie nur innerhalb des Elements und dessen Unterelemente;
<xsl:if test="position()=1">
<xsl:variable name="decision" select="First node for the turn..."/>
</xsl:if>
<xsl:if test="position()=last()">
<xsl:variable name="decision" select="Last node for the turn..."/>
</xsl:if>
erzeugt keine Variable, die ich nach dem letzten </xsl:if> noch ansprechen könnte.
position()
position() gibt die Nummer des aktuell in Bearbeitung befindlichen
Templates zurück. Achtung: Diese Nummerierung unterscheidet nicht
die Art des Tags, nach einem apply-templates select="*" auf
<hallo>
welt und
<eintag/>
<eintag/>
</hallo>
wäre Position also 1 bei hallo und 2 bzw. 3 bei eintag
So funktioniert's richtig:
<xsl:template match="//hallo">
<xsl:apply-templates select="*[not(self::eintag)]"/> <!-- not(self::eintag) bedeutet: zuerst einmal alle Tags bearbeiten, die NICHT eintag-tags sind. -->
<xsl:apply-templates select="eintag"/>
</xsl:template>
<xsl:template match="eintag">
Position: <xsl:value-of select="position()"/><br/>
<xsl:value-of select="."/>
</xsl:template>
last()
last() gibt die Anzahl der Templates zurück, die anzuwenden sind.
Es eignet sich somit hervorragend um in einem xsl:if zusammen
mit einem position() zu überprüfen, ob gerade das letzte
(vorletzte etc.) Tag einer bestimmten Gattung bearbeitet wird.
<xsl:if test="position()=last()">
Letztes Tag dieser Template-Reihe
</xsl:if>
xsl:number
*count *level *format
<xsl:number count="item">
nummeriert die entsprechenden Tags (bei diesem Aufruf:
Nummerierung startet bei 1 und zählt jeweils nur die Tags
der entsprechenen Verschachtelung - Ergebnisse wie 1,2,1,2,3,4,3,5 sind
vorprogrammiert). Das Attribut level="any" anstelle match="item" nummeriert
durchgehend durch alle Ebenen - aber auch das ist nicht das was ich unter
einer Gliederung verstehe. Diese leistet erst level="multiple" count="item".
Das (optionale) Format-Parameter kann noch viel mehr:
format="1.1.1.1" nummeriert nach arabischen Zahlen (Standart)
format="i.1.I.1" nummeriert nach kleinen römischen, dann arabischen, dann
großen römischen und dann wieder arabischen Zahlen (bspw:ii.2.IX.9)
Sollten Sie nicht genug Format-Anweisungen gegeben haben (z.B.: i bei einer
Schachtelungstiefe von 2) werden die nichtangegebenen Ziffern arabisch
(z.B. iii.3.1).
Weitere Beispiele:
|
c.1
|
c.1 für das erste, d.1 für das zweite top-level Element
|
|
3.1
|
1.1 für das erste, 2.1 für das zweite top-level Element!
Hier zählt offensichtlich: Wenn eine Zahl gemeint ist fange bei 1 an.
|
|
Token
|
Sequenz
|
|
01
|
01,02,03...10,11
|
|
andere Unicodes-Nummern
|
entsprechend
|
|
a
|
a,b,c..x,y,z,aa,ab...
|
|
A
|
A,B,C..X,Y,Z,AA,AB...
|
|
i
|
i,ii,iii..ix,x,xi...
|
|
I
|
I,II,III..IX,X,XI...
|
alle nichterkannten Zeichen sind offenbar als Trennzeichen gültig,
z.B. - und *. Interessant genug: nichterkannte Zeichen (wie
schließende Klammern) am Ende
des Format-Strings werden offensichtlich automatisch ans Ende der
Ausgabe angefügt, siehe Beispiel-XML und Beispiel-XSL.
document
string
Mit document('dateiname.xml') kann man in XPath Tags aus anderen
Dateien matchen (für Inhaltsverzeichnisse und Stichwortlisten meist
unerlässlich). Das geht überraschend einfach z.B. mit
<xsl:for-each select="document('xslt6.xml')//hello-world">
<xsl:value-of select="."/>
</xsl:for-each>
Da Dateinamen immer eindeutig sein müssen (sprich: *.xml geht nicht)
ist jedoch meistens Projektdateien-anlegen angesagt. In einer
Datei project.xml legt man dann z.B. in File-Tags mit den Attributen
name alle Dateinamen des Projektes ab, durchforstet sie mit einer
foreach-Schleife und inenrhalb dieser Schleife setzt man die Schleife
für die eigentlichen Tags an:
<xsl:for-each select="document('xslt6.xml')//file">
<xsl:variable name="filename" select="concat(substring-before(@name, '.xml'), '.html')"/>
<xsl:for-each select="document(@name)">
<a href="{$filename}"/>
<xsl:value-of select="//article/@name"/>
<br/>
<xsl:value-of select="//article/@name"/>
<br/> </xsl:element>
</xsl:for-each>
</xsl:for-each>
Obiges Beispiel geht sogar noch einen Schritt weiter: in der Projekt-Datei
werden die Dateinamen natürlich als .XML abgelegt, die concat(substring-before(@name, '.xml'),'.html')
- Anweisung sorgt aber dafür, dass der Dateiname abgeschnitten wird und als .html (!)
gelinkt wird (hoffen wir, dass diese erzeugt wurden!).
Solche document-aufrufe sind übrigens ein fortgesetztes Ärgernis, weil
Sie immer Fehler melden, wenn nicht alle Dateien im Projekt vorhanden und
well-formed sind.
Das Beispiel xslt6.xsl
(mit xslt6.xml) zeigt ausführlich eine Anwendung
(Auflistung von Dateien und aufzählen der enthaltenen Bilder und auflistung der Bilder mit
Link auf die entsprechenden Dateien).
xsl:copy
Der Container für xsl:copy-of.
<xsl:template match="a|abbr|acronym|address|b|big|blockquote|br|cite|dfn|div|em|h1|h2|h3|h4|h5|h6|hr|i|kbd|p|pre|q|quote|samp|span|small|strong|sub|sup|tt|var|button|fieldset|form|input|label|legend|option|optgroup|select|caption|col|colgroup|table|tbody|td|tfoot|th|thead|tr|dl|dd|dt|ol|ul|li|img" xmlns:html="http://www.w3.org/1999/XSL/some">
<xsl:copy>
<xsl:copy-of select="@*"/><!-- alle Attribute und Tags kopieren -->
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
kopiert einen Großteil der XHTML 1.1-Tags aus dem Ursprungsdokument
in die Ausgabe und wird nebenbei auch für dieses Dokument genutzt
(xhtmlxsl.xsl ist in documl.xsl eingebunden).
Außer um Tags in die Ausgabe "durchzuschleifen" kann dieses Tag natürlich auch
verwendet werden um einen Abschnitt aus derselben oder einer anderen Quelldatei
an die entsprechende Stelle zu kopieren.
xsl:copy-of
select
Kopiert Tags. Im Beispiel werden z.B. einige HTML-Tags bei
Vorkommen ungeändert und mit allen Attributen in die Ausgabe kopiert.
xsl:import
xsl:import importiert ein Style-Sheet. Wichtig ist nur zu
beachten, dass es ein top-level-Element ist, also als Kind zu
xsl:stylesheet "sehr weit oben" in der Datei stehen muss.
xsl:import importiert mit einer niedrigeren Import-Präzedenz
als xsl:include, d.h. dass in der lokalen Datei matchende
templates den importierten auf jeden Fall vorgezogen werden
(anders bei xsl:include).
<xsl:import href="common.xsl"/>
importiert die Style-Sheet-Datei common.xsl.
xsl:include
xsl:import importiert ein Style-Sheet als wäre es an dieser Stelle
im Quelltext definiert. Es ist wie xsl:import ein top-level-Element.
<xsl:include href="common.xsl"/>
fügt die Style-Sheet-Datei common.xsl an diese Stelle ein.
In XSLT-Steuerdateien gilt: first comes first serves,
also wird bei zutreffende Templates, sofern doppelt definiert, nur
das erste treffende Template angewendet. Sollte also in der
Include-Datei ein zutreffendes template definiert sein, wird dieses
nur dann nicht angewendet, wenn in der XSLT-Datei vor der xsl:include-Zeile
bereits ein treffendes Template angewand wurde.
substring-before()
value, substring
Liefert den Stringteil von value zurück, der VOR Substring steht.
substring-after()
value, substring
Liefert den Stringteil von value zurück, der NACH Substring steht.
concat()
str1, str2
Liefert einen aus str1 und str2 zusammengesetzten String zurück.
xsl:call-template
name
Ruft das Template name auf (man beachte die Ähnlichkeit zu einem Funktionsaufruf).
<xsl:template name="mytemplate">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="mytemplate"/>
</xsl:template>
Eine dateiübergreifende Referenz sortieren
Eine Referenz zu erstellen, ist in XSLT einfach mit einem
for-each-Tag möglich;
aus verschiedenen Dateien liest man mit document.
Normalerweise erstellt man eine XML-Datei in der man alle XML-Dateien erwähnt, die
am aktuellen Projekt beteiligt sind:
<project>
<file id="datei1" name="datei1.xml"/>
<file id="datei2" name="datei2.xml"/>
</project>
Diese kann man dann z.B. mit xsl:for-each select="document('project.xml')//file" ansprechen.
In diesem Beispiel habe ich jeder Datei noch eine ID gegeben, die in der
Datei selbst dann auch irgendwo auftauchen sollte - so spreche ich z.b.
in diesem Projekt in project.xml die following-sibling bzw. preceding-siblings
des files an, das die gleiche ID hat wie die aktuelle Datei um
Links auf die nächste bzw. vorhergehende Datei zu zeigen (in XSLT ist es normalerweise
unmöglich, den Dateinamen der aktuelle in bearbeitung-befindlichen-Datei herauszufinden).
Das Problem ist nun das, dass ich in der Schleife, die die Referenzpunkte sortiert,
nur die einer XML-Datei ansprechen kann (for-each select="document($documentname)//ref");
<xsl:for-each select="document(document('project.xml')//file/@name)//ref"> geht nämlich
NICHT.
Die Lösung ist die, dass man alle //ref's aus allen Dokumenten erst einmal in eine Variable kopieren muss
(diese wird damit selbst zum Baum), dann die Variable sortiert und ausgibt. Das gesamte ref-Tag kopieren
ist in dem Falle wichtig, weil man schlecht sortieren kann, wenn man nur mit Strings
arbeitet und: das ref-Tag enthält oft auch ein Verweisziel, wie einen Dateinamen, der
dann an eine andere Stelle kopiert werden würde.
<xsl:variable name="nodetree">
<xsl:for-each select="document('project.xml')//file">
<file xmlns="" name="{@name}">
<-- hier wird in der neuen Baumvariable ein Element angelegt das den Dateinamen enthält, in welchem die refs gerade stehen-->
<xsl:copy-of select="document(@name)//ref"/>
<-- hier werden die Ref-tags als Unterelement zum Dateinamen in den Baum kopiert -->
</file>
</xsl:for-each>
</xsl:variable>
<h2>Nach Stichwort</h2> <-- Nach Stichwort sortieren -->
<xsl:for-each select="$nodetree//ref"> <-- alle Refs wieder aus dem Baum raus-->
<xsl:sort select="@name"/> <-- nach Attribut name sortieren-->
<a href="{../@name}"><xsl:value-of select="@name"/></a><br/>
<-- Und zusammen mit Link auf das Name-Attribut des übergeordneten Elements (File) ausgeben-->
</xsl:for-each>
<h2>Nach Datei</h2> <-- Nach Datei sortieren -->
<xsl:for-each select="$nodetree//file">
<xsl:sort select="@name"/>
<xsl:for-each select="//ref">
<xsl:sort select="@name"/> <-- Jeden Dateiinhalt nach Stichwort sortieren -->
<a href="{../@name}#{../@a}"><xsl:value-of select="@name"/></a><br/><-- ... und ausgeben -->
</xsl:for-each>
</xsl:for-each>
Die in diesem Projekt verwendete Transformation ist nochmal ein bisschen schwerer weil
die Links genauer sein sollten und auf jeden Absatz zielen - das heißt letztendlich,
dass ich ich die Sections (s-tags) in den Sortierbaum aufnehmen musste...
Zum debuggen empfehle ich übrigens mit copy-of select="$baumvariable" die Variable
erstmal in den HTML-Quelltext zu kopieren um dann dort zu sehen ob sie funktioniert.
What's missing
Es trifft nicht ganz zu, diesen Artikel "für Profis" genannt zu haben;
Das XSLT ein bisschen mehr ist, als hier erwähnt wurde,
"wäre ungefähr wie zu sagen, die Haut eines Ertrinkenden sei feucht.
Es ist richtig aber es trifft nicht den Kern der Sache" (Scott Adams).
XSLT ist ein weitaus mächtigeres Werkzeug als ich bei meinen ersten
Style-Sheets gedacht habe - hoffentlich können Sie mit diesen Dateien
schonmal anfangen, Ihre ersten Style-Sheets zu schreiben und vielleicht
springt der Funke über...
Grundlegender Aufbau
DTDs sind in SGML definiert, aber nicht in XML.
Überwiegend werden <!-Tags verwendet, Elemente
mit !ELEMENT, Attribute mit !ATTLIST elementname
(in einer XML- Umgebung wäre es logischer, die Attribute
als Tags in den Element-Tag zu schreiben) und Entities
mit !ENTITY definiert.
Einbindung
DTDs werden in die XML-Datei eingebuden mit
<!DOCTYPE ROOTELEMENT SYSTEM "DTDDATEINAME.dtd">
PCDATA
Tags können als Inhalt entweder weitere Tags und/oder
Buchstaben haben (z.B. <p> hallo Welt </p>).
Diese Buchstaben werden in DTDs entweder als
CDATA (character data, für Attribute) oder als
PCDATA (parsed character data) definiert.
Elemente
Tags (entsprechen Elementen) werden mit dem Schlüsselwort
<!ELEMENT tagname> definiert.
---myfirst.dtd
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Schaden tut der XML-Header nicht-->
<!ELEMENT hello-world (#PCDATA)>
---myfirst.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet href="myfirst.xsl" type="text/xsl"?>
<!DOCTYPE hello-world SYSTEM "myfirst.dtd">
<hello-world>
Hallo Welt!
</hello-world>
Beachten Sie die neue Zeile !DOCTYPE und die absolute Pfadangabe des
DTDs: hier sind keine relativen Pfade möglich.
leere Tags und volle Tags
Das Schlüsselwort EMPTY definiert Tags, die keinen Inhalt haben dürfen
(wie etwa das br/-Tag in HTML)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world EMPTY>
dahingehen definiert ANY,
dass jedes Tag in diesem Tag vorkommen darf.
Tags erlauben
Innerhalb der Klammern nach dem Tagnamen können Sie allerdings auch
eine Liste mit Tags angeben, die vorkommen sollen oder müssen.
Das Beispiel verlangt im Tag hello-world nach genau einem Vorkommen des Tags
name, das Text enthalten kann.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world (name)>
<!ELEMENT name (#PCDATA)>
Weitere Tags werden mit Kommata getrennt
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world (name, alter)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT alter (#PCDATA)>
Um die Anzahl anzugeben, in der Tags vorkommen dürfen, benutzt
man die Zeichen
|
*
|
für keinmal, einmal oder öfter
|
|
+
|
für mindestens einmal oder öfter
|
|
?
|
für keinmal oder einmal
|
|
(element1 | element2)
|
für Element1 ODER Element2
|
Beispiel in DTD.DTD bzw. DTD.XML .
Sie sehen dort auch, dass Sie die Reihenfolge der Tags einhalten müssen.
PCDATA können Sie in die Tags auch einbringen;
um zu versuchen, dies
<p>Dies ist <u>ein</u>
<i>Text mit <u>Unterstrich</u></i></p>
in einem DTD "legal zu machen", folgt
1) Muss P mit PCDATA, i oder u zu füllen sein
2) Muss i mit PCDATA oder u zu füllen sein und
3) Muss u mit PCDATA oder i zu füllen sein
daraus folgt
<!ELEMENT p (#PCDATA | i | u)*>
<!ELEMENT i (#PCDATA | u)*>
<!ELEMENT u (#PCDATA | i)*>
Da PCDATA | Sektionen laut Internet Explorer ("Mixed content model must be defined as zero or more('*'). ")
gesternt werden müssen, erklärt sich der * in der ersten Zeile.
Dieser würde normalerweise das Verwenden von mehreren Top-Level-P-Tags
ermöglichen, da das dann jedoch kein XML mehr wäre (
höchstens ein Top-Level-Tag) ergeben sich Schwierigkeiten wenn man's versucht.
Beachten Sie auch dass Sie im Doctype der XML-Datei das neue Top-Level-Tag
angeben müssen:
<!DOCTYPE p SYSTEM "dtd2.dtd">
Der Einfachheit halber habe ich das Beispiel unter
Samples/dtd2.dtd bzw. Samples/dtd2.xml
abgelegt.
Attribute
Attribute werden mit !ATTLIST definiert - so
<!ATTLIST p
name CDATA #REQUIRED
beschreibung CDATA #IMPLIED
autor CDATA "ich"
groesse (klein|mittel|gross) #IMPLIED
intoc (ja|nein) "ja"
>
wobei
|
#REQUIRED
|
bedeutet, dass das Attribut vom XML-Schreiber angegeben werden muss
|
|
""
|
den Defaultwert des Attributs angint und
|
|
(a|b|c)
|
bedeutet, dass das Modul den Wert a oder b oder c haben muss.
|
Da Atributnamen in einem Tag nur einmal benutzt werden dürfen,
entfällt der ganze Kram mit "mindestens einmal" und ?*+.
Um den Spaß vorwegzunehmen habe ich auch ein
Projekt gespeichert, dass sowohl aus DTD als auch aus
XML- und XSLT-Datei
besteht. Die Ausgabe zeigt sehr schön, dass
die Default-Attributwerte auch tatsächlich so interpretiert werden
(autor und intoc wurden ja nicht in der XML-Datei definiert).
Entities
Zwei Beispiele:
<!ENTITY myente "quaak">
<!ENTITY auml "ä">
Während der Aufruf von &myente; in der XML-Datei
quaak erzeugt ä ein ä.
Eine Weitergabe der Entity als
<!ENTITY auml "ä">
kommt übrigens aus zwei Gründen nicht in Frage:
Erstens kennt XML (nur XHTML!) gar kein ä sondern nur Unicode-Entities und
zweitens wäre das "infinite entity reference loop"
(drittens arbeiten wir sowieso im 8859-1-Zeichensatz und gebrauchen keine Entities für Umlaute ;))
Was weggelassen wurde
Nicht erwähnt habe ich Parameter Entity References
(Entities die in der DTD genutzt werden können und damit eine gewisse
Modularisierung erlauben - oft benutzte Zeichenketten kann man als
Parameter Entity zentralisieren), bedingte Abschnitte in der DTD und
Notationen.
Mit Parameter Entity References kann man auch andere DTDs in den
eigenen DTD importiert.
Warum Schemata
Anders als DTDs werden
Schemata in einem XML-Format definiert. Das ist an und
für sich schonmal ein Vorteil, dazu kommt aber dass das
u.A. so ist weil Schemata erst 2001 vom W3C verabschiedet worden
sind und es deshalb erheblich mehr Werkzeuge gibt die auf Konformität
mit einem DTD prüfen und Schemata noch nicht interpretieren.
Ich persönlich nutze Schemata nur dort, wo ich deren Vorteil brauche
und der ist: Daten und nicht Dokumentorientiert zu arbeiten.
Es gibt in Schemata verschiedene Datentypen, in DTDs
gibt es diese nicht. Ich kann also sagen ein Tag darf nur ein Datum
enthalten, bei DTDs muss ich damit leben dass die XML-Autoren
in ein Feld namens Datum 1999, 1.10.1999, erster Oktober 1999 oder
Mickey Mouse hat einen Bruder reinschreibt. Werden die XMLs
automatisch verarbeitet, z.B. in eine Datenbank eingetragen wird
das entsprechende Programm spätestens beim Mickey-Mouse-Satz seine
helle Freude haben.
Einbindung
Schemata werden in die XML-Datei eingebunden mit
<ROOTELEMENT xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SCHEMADATEINAME.xsd">
...
</ROOTELEMENT>
Tags
Tags werden mit dem xsd:element-Tag beschrieben.
Ein sehr einfaches Schema wäre z.B.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
<xsd:element name="p" type="xsd:string"/>
</xsd:schema>
Ein leeres Root-Tag habe ich in der Praxis übrigens noch nie
gesehen...
Der Typ ist übrigens mein XML-Lieblingstag: erstaunlich leicht
zu programmieren lässt sich nämlich ein eigener Typ:
Untertags
mit
<xsd:complexType name="wasbeliebt">
<xsd:sequence>
<xsd:element name="b" type="xsd:string"/>
<xsd:element name="i" type="xsd:string"/>
<xsd:element name="u" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
definieren Sie den Typ "wasbeliebt", den Sie in p mit
<xsd:element name="p" type="wasbeliebt"/>
einbinden. Er verpflichtet Sie zu einen b, einem i und einem
u-Tag mit jeweils einem String als Inhalt.
Inline Schemata
Man kann die complexTypes übrigens auch gleich ins Element einbetten:
<xsd:element name="p">
<xsd:complexType name="wasbeliebt">
<xsd:element name="i" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
Wobei sich der complexType zwar mit einem Namen bezeichnen,
aer nicht mehr ausserhalb des element-Tags als type="wasbeliebt"
angeben lässt. Dass sicht kein element-type definieren UND
gleichzeitig ein complexType einbetten lässt sollte sich von selbst
verstehen.
Tags zur Auswahl stellen
Wenn Sie den DTD-Teil
dieses Tutorials schon gelesen haben, wissen Sie aber, dass das
nicht Sinn der Sache war. Es sollen beliebig viele und geschachtelte
i us und bs möglich sein. Ein xsd:choice sieht zwar wie eine
Lösung aus, ist aber keine
<xsd:complexType name="wasbeliebt">
<xsd:choice>
<xsd:element name="b" type="xsd:string"/>
<xsd:element name="i" type="xsd:string"/>
<xsd:element name="u" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
weil es nur ein Tag erlaubt - immerhin kann das jetzt ENTWEDER b, u oder p sein.
Die Lösung liegt in den Attributen:
minOccurs
minOccurs und maxOccurs liegen in engem Wettstreit
mit type um meine persönlichen XML-Lieblingsattribute. Während Type
eine beinahe schon an PHP erinnernde intuitive (weil logische)
Programmierung erlaubt sind minOccurs und maxOccurs in vielen Tags
erlaubt und -- bedeuten immer das Gleiche (keine Ausnahmen, kein
fehlersuchen, kein Referenzenwühlen).
minOccurs="n" bedeutet: Das in dem Tag spezifizierte Element muss
mindestens n-mal vorkommen.
maxOccurs
maxOccurs="n" verhält sich analog: Das in dem Tag
spezifizierte Element darf höchstens
n-mal vorkommen. Wobei jede Zahl für eine Zahl steht und
"unbounded" für unendlich.
Mit diesen beiden Elementen lässt sich dann auch unser ibu
(italic/bold/underline)-Beispiel weiter bringen:
durch ein ergänzen einer Zeile erhält man nämlich
<xsd:choice minOccurs="0" maxOccurs="unbounded">
... die Möglichkeit, die Sequenz dreimal hintereinander zu schreiben.
An sich hätte man auch die Möglichkeit, das minOccurs und maxOccurs
hinter die einzelnen Elemente zu schreiben, etwa
<xsd:element name="b" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="i" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="u" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
so, (diese 3 Zeilen würden übrigens auch in einer Sequenz das gewünschte Ergebnis bringen).
Genaugenommen besteht ein ziemlich komplizierter Unterschied der
sich ungefähr so erklären lässt:
Entweder, man macht beliebig viele Choices die entweder aus i, b oder u
bestehen oder man macht eine Choice die aus beliebig vielen i, bs und us
besteht.
minOccurs="0" und maxOccurs="0" bei jedem Element machen die Sequenz übrigens de-facto
zu einem Choice, das Problem ist, wenn die Sequenz nicht eingehalten wird (z.B. ein u vor
einem b kommt), wird das Stylesheet invalid wenn nicht auch die Sequenz selbst
als minOccurs="0" und maxOccurs="0" definiert wurde (denn dann könnte eine Sequenzdie
nur aus u besteht vor einer Sequenz, die nur aus b besteht, existieren).
Lange Rede kurzer Sinn: obwohl es noch mindestens zwei andere Arten gibt definiert
<xsd:element name="p" type="wasbeliebt"/>
<xsd:complexType name="wasbeliebt">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="b" type="xsd:string"/>
<xsd:element name="i" type="xsd:string"/>
<xsd:element name="u" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
die Sache. Basta.
Tags in beliebiger Reihenfolge erlauben
Leichter als in DTDs kann man in Schemata Tags erlauben und
von der Reihenfolge absehen: wie xsd:sequence und xsd:choice
wird xsd:all definiert.
<xsd:element name="p" type="wasbeliebt"/>
<xsd:complexType name="wasbeliebt">
<xsd:all>
<xsd:element name="b" type="xsd:string"/>
<xsd:element name="i" type="xsd:string"/>
<xsd:element name="u" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
Es arbeitet wie eine Sequence unabhängig von der Reihenfolge, mit
jeweils maximal einem Auftreten eines Tags.
Attribute
Attribute werden in einem complexType mit xsd:attribute definiert
(und dürfen im complexType immer erst NACH choices oder sequences
definiert werden).
<xsd:element name="p" type="wasbeliebt"/>
<xsd:complexType name="wasbeliebt">
<xsd:attribute name="ibu" type="xsd:string"/>
</xsd:complexType>
oder
<xsd:element name="p" type="wasbeliebt"/>
<xsd:complexType name="wasbeliebt">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="b" type="xsd:string"/>
<xsd:element name="i" type="xsd:string"/>
<xsd:element name="u" type="xsd:string"/>
</xsd:choice>
<xsd:attribute name="ibu" type="xsd:string"/>
</xsd:complexType>
(als schema2.xml bzw.
schema2.xsd)
Da haben wir übrigens den Dokumenttyp, der nur das
Top-Level-Tag beinhalten darf.
Mit dem Attribut use können Sie übrigens angeben ob das
entsprechende Attribut definiert werden muss.
Unterschieden wird zwischen "required" (muss angegeben sein),
"optional" (kann angegeben sein), "default" (kann angegeben sein)
und "prohibited" (darf nicht angegeben sein, was darauf hindeutet,
dass in Schemata irgendwo ein "if" definiert sein muss).
Ein min/maxOccurs verbietet sich deshalb, weil Attribute ja
sowieso nur höchstens einmal den gleichen
Namen haben dürfen.
default-Werte für Attribute gibt es in Schemas auch,
soweit ich das verstanden habe werden sie mit
use="default" und einem weiteren Attribut, value="Wert"
gebildet. Das habe ich auch in schema3.xsd angedeutet und
mit XMLSpy validieren lassen, aber mein Saxon 6.2.2 scheint
es nicht auszuwerten. Genausowenig wie default-Werte für Tags
nebenbei, die mit dem Attribut "default="Defaultwert"" möglich sein
sollten.
Attributaufzählungen
Sie können wie in DTDs die Auswahlmöglichkeiten bei einem
Attribut gezwungenermaßen einschränken -- und zwar durch
verwenden eines simpleTypes mit einer restriction:
<xsd:attribute name="bio" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="clear"/>
<xsd:enumeration value="investigating"/>
<xsd:enumeration value="suspicious"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
Wie man sieht ist "base" der Datentyp, der eingeschränkt werden soll.
Wertebereich einschränken
angenommen wir möchten zu p noch ein Attribut, Note.
Diese Note soll eine ganze Zahl im Bereich von 1-6 sein
(in der Schweiz von 6-1 ;)). Wir machen auch das mit einer
restriction, geben aber ein minInclusive und ein maxInclusive
vor.
<xsd:simpleType name="notentyp">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="6"/>
</xsd:restriction>
</xsd:simpleType>
Datentypen
Von Hause aus bieten Schemas die folgenden Datentypen:
|
Name
|
Beispiele
|
Erklärung
|
|
String
|
"Hallo Welt"
|
Zeichenkette
|
|
boolean
|
{true, false}
|
entweder true oder false
|
|
decimal
|
42.9
|
Kommazahl
|
|
float
|
42.9, -12.4, 44, 2.03E5, 0, -0, INF, -INF, NAN
|
INF=Unendlich, -INF=minus Unendlich, NAN=Not A Number, keine Zahl
|
|
duration
|
P2Y5M4DT5H17M33.4S
|
Anzahl Jahre, Anzahl Monate, Anzahl Tage, Trenner zwischen Datum und Zeit ("T"), Stunden, Minuten und Sekunden
|
|
dateTime
|
2001-06-08T18-46-02
|
Jahre, Monate, Tage, Trenner zwischen Datum und Zeit ("T"), Stunden, Minuten und Sekunden
|
|
time
|
19:12:00.03
|
Stunden,Minuten,Sekunden.Hundertstel
|
|
date
|
2001-06-08
|
Jahr-Monat-Tag
|
|
gYearMonth
|
2001-06
|
Jahre, Monate
|
|
gYear
|
2001
|
Jahre
|
|
gMonthDay
|
12-12
|
Monat, Tag
|
|
gDay
|
12
|
Tag
|
|
gMonth
|
5
|
Monat
|
|
hexBinary
|
12EAB0
|
Ein hexadezimaler Wert
|
|
anyURI
|
http://www.usegroup.de/
|
Eine URI
|
Abgeleitete Datentypen
|
|
integer
|
12
|
Ganzzahlen
|
|
positiveInteger
|
12
|
positive Ganzzahlen
|
|
negativeInteger
|
-12
|
Ganzzahlen kleiner Null
|
|
long
|
122
|
-9223372036854775808 bis 9223372036854775808
64-Bit Integer
|
|
int
|
122
|
-2147483648 bis 2147483647
32-Bit Integer
|
|
byte
|
122
|
-127 bis 128
8-Bit Integer
|
Eigene Datentypen definieren
Mit
<xsd:element name="plz" type="plz"/>
...
<xsd:simpleType name="plz">
<xsd:restriction base="xsd:integer">
<xsd:length value="5"/>
können Sie angeblich (XMLSpy interpretier offensichtlich falsch)
den Taginhalt auf 5 Zahlen beschränken,
spätestens bei dem Versuch, eine Telefonnummer mit
Vorwahl zu verlangen, muss ich mangels Testumgebung aufgeben.
Versuchen wollte ich
<xsd:restriction base="xsd:integer">
<xsd:pattern value="\d{5}\/d{5}"/>
</xsd:restriction>
für ein Pattern aus 5 digits, einem /, den man bei
regulären Ausdrücken mit dem \ maskiert (\/) und dann
nochmals 5 digits. Genaugenommen ist das eher ein
Beispiel für schlechte reguläre Ausdrücke; denn
vierstellige Vorwahlen sollten im heutigen Handyzeitalter
möglich sein und die Länge der Nummer auf keinen Fall nur
5 betragen dürfen.
Entities
"Since XML Schema begins work on the infoset of a well-formed
(perhaps valid) XML document, parsed entity definition substitution
has already taken place. We decided a two-pass architecture was too
clunky, and arguably impossible, and concluded the best thing was to
leave XML 1.0 entities to XML 1.0 mechanisms (i.e. you can define
entities in the internal subset) ", Henry S. Thompson.
Auf Deutsch: Da Schemata nur auf XML-Dateien anzuwenden sind,
die schon well-formed sind, muss jeder sehen wo er bleibt.
Zum Beispiel hier:
<!DOCTYPE ROOTELEMENT [
<!ENTITY eacute "é">
]>
in jeder XML-Datei macht zwar keinen Spaß, funktioniert aber.
Dahingegen muss ich leider zugeben, dass ich das W3C-Beispiel
für Entityähnliche Elemente nicht zum laufen bekommen habe:
We can achieve a similar but not identical outcome by declaring an element in a schema, and by setting the element's content appropriately:
<xsd:element name="eacute" type="xsd:token" fixed="é"/>
And this element can be used in an instance document:
Using an element instead of an entity in an instance document.
<?xml version="1.0" ?>
<purchaseOrder xmlns="http://www.example.com/PO1"
xmlns:c="http://www.example.com/characterElements"
orderDate="1999-10-20>
<!-- etc. -->
<city>Montr<c:eacute/>al</city>
<!-- etc. -->
</purchaseOrder>
Unicode
Für eigene XML-Formate, die dann noch per XMLT umgewandelt werden,
kann es wichtig sein, Umlaute einzubinden. In XHTML stehen
zwar Entities wie ä zur Verfügung, Unicode funktioniert allerdings
unabhängig davon immer auch in eigenen Formaten.
Hier einige wichtige deutsche Unicodes:
|
Ä
|
00c4
|
Ä
|
ä
|
00e4
|
ä
|
|
Ü
|
00dc
|
Ü
|
ü
|
00fc
|
ü
|
|
Ö
|
00d6
|
Ö
|
ö
|
00f6
|
ö
|
|
ß
|
00df
|
ß
|
&
|
0026
|
&
|
Lizenz
GNU Free Documentation License
Version 1.1, March 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
written document "free" in the sense of freedom: to assure everyone
the effective freedom to copy and redistribute it, with or without
modifying it, either commercially or noncommercially. Secondarily,
this License preserves for the author and publisher a way to get
credit for their work, while not being considered responsible for
modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work that contains a
notice placed by the copyright holder saying it can be distributed
under the terms of this License. The "Document", below, refers to any
such manual or work. Any member of the public is a licensee, and is
addressed as "you".
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject. (For example, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, whose contents can be viewed and edited directly and
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup has been designed to thwart or discourage
subsequent modification by readers is not Transparent. A copy that is
not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML designed for human modification. Opaque formats include
PostScript, PDF, proprietary formats that can be read and edited only
by proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML produced by some word processors for output
purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
2. VERBATIM COPYING
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
3. COPYING IN QUANTITY
3. COPYING IN QUANTITY
If you publish printed copies of the Document numbering more than 100,
and the Document's license notice requires Cover Texts, you must enclose
the copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a publicly-accessible computer-network location containing a complete
Transparent copy of the Document, free of added material, which the
general network-using public has access to download anonymously at no
charge using public-standard network protocols. If you use the latter
option, you must take reasonably prudent steps, when you begin
distribution of Opaque copies in quantity, to ensure that this
Transparent copy will remain thus accessible at the stated location
until at least one year after the last time you distribute an Opaque
copy (directly or through your agents or retailers) of that edition to
the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
4. MODIFICATIONS
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
- A. Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
- B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has less than five).
- C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
- D. preserve all the copyright notices of the Document.
- E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
- F. Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
- G. preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
- H. Include an unaltered copy of this License.
- I. preserve the section entitled "History", and its title, and add to
it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section entitled "History" in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
- J. preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the "History" section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
- K. In any section entitled "Acknowledgements" or "Dedications",
preserve the section's title, and preserve in the section all the
substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
- L. preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
- M. Delete any section entitled "Endorsements". Such a section
may not be included in the Modified Version.
- N. Do not retitle any existing section as "Endorsements"
or to conflict in title with any Invariant Section.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections entitled "History"
in the various original documents, forming one section entitled
"History"; likewise combine any sections entitled "Acknowledgements",
and any sections entitled "Dedications". You must delete all sections
entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, does not as a whole count as a Modified Version
of the Document, provided no compilation copyright is claimed for the
compilation. Such a compilation is called an "aggregate", and this
License does not apply to the other self-contained works thus compiled
with the Document, on account of their being thus compiled, if they
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one quarter
of the entire aggregate, the Document's Cover Texts may be placed on
covers that surround only the Document within the aggregate.
Otherwise they must appear on covers around the whole aggregate.
8. TRANSLATION
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License provided that you also include the
original English version of this License. In case of a disagreement
between the translation and the original English version of this
License, the original English version will prevail.
9. TERMINATION
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
Kurzreferenz

Nach Stichwort
!ATTLIST
!DOCTYPE
!ELEMENT
!ENTITY
<!-- -->
ancestor::
article
articleinfo
Attribute ansprechen
Bilder, DocBook/XML
br-Tag, in DocBook
child::
concat()
corpauthor
date
descendant::
Docbook
document()
emphasis
following-sibling::
footnote
Fußnoten, DocBook/XML
imagedata
imageobject
inlinemediaobject
Kommentare
Kursiv, DocBook/XML
Kurzform einer Ausgabe
last()
Links, DocBook/XML
maxOccurs
minOccurs
parent::
PCDATA
PDF, export aus DocBook
position()
preceding-sibling::
Schemata inline
self::
subject
subjectset
subjectterm
substring-after()
substring-before()
title
ulink
Unicode
XML:FO
xsd:all
xsd:attribute
xsd:choice
xsd:complexType
xsd:complexType
xsd:element
xsd:enumeration
xsd:maxInclusive
xsd:minInclusive
xsd:restriction
xsd:sequence
xsd:simpleType
xsd:simpleType
xsl:apply-templates
xsl:apply-templates
xsl:call-template
xsl:case, siehe xsl:choose
xsl:choose
xsl:copy
xsl:copy-of
xsl:else, das fehlende
xsl:for-each
xsl:if
xsl:import
xsl:include
xsl:number
xsl:otherwise
xsl:sort
xsl:template
xsl:text
xsl:value-of
xsl:variable
xsl:when
xsl:while, das fehlende
{}

Nach Datei
docbook.html
article
articleinfo
Bilder, DocBook/XML
br-Tag, in DocBook
corpauthor
date
Docbook
emphasis
footnote
Fußnoten, DocBook/XML
imagedata
imageobject
inlinemediaobject
Kursiv, DocBook/XML
Links, DocBook/XML
PDF, export aus DocBook
subject
subjectset
subjectterm
title
ulink
XML:FO
dtds.html
!ATTLIST
!DOCTYPE
!ELEMENT
!ENTITY
PCDATA
einstieg.html
<!-- -->
Attribute ansprechen
Kommentare
Kurzform einer Ausgabe
xsl:apply-templates
xsl:apply-templates
xsl:template
xsl:text
xsl:value-of
{}
entities.html
Unicode
fortgeschrittene.html
xsl:case, siehe xsl:choose
xsl:choose
xsl:else, das fehlende
xsl:for-each
xsl:if
xsl:otherwise
xsl:sort
xsl:variable
xsl:when
xsl:while, das fehlende
fuer-profis.html
concat()
document()
last()
position()
substring-after()
substring-before()
xsl:call-template
xsl:copy
xsl:copy-of
xsl:import
xsl:include
xsl:number
grundkenntnisse.html
ancestor::
child::
descendant::
following-sibling::
parent::
preceding-sibling::
self::
schema.html
maxOccurs
minOccurs
Schemata inline
xsd:all
xsd:attribute
xsd:choice
xsd:complexType
xsd:complexType
xsd:element
xsd:enumeration
xsd:maxInclusive
xsd:minInclusive
xsd:restriction
xsd:sequence
xsd:simpleType
xsd:simpleType