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.