XML definiert ein Datenformat für hierarchisch gegliederte Informationen. Ein wohlgeformtes Dokument beginnt mit einer Deklaration, die Version und Zeichensatz benennt, gefolgt von optionalen Stylesheets und einer DTD, die das Wurzelelement festlegt. Dieses enthält schließlich alle Knoten, aus denen der Baum aufgebaut wird.
hello.xml<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <!DOCTYPE article [ … ]> <article> <title>Hello, World!</title> <section> <title>A Heading</title> <para>The quick brown fox jumps over a lazy dog.</para> </section> </article>
Die formale Syntax in augmentierter Backus-Naur-Form lautet:
Nicht-Terminal | Terminale | Kommentar | |
document | = | declaration *misc | |
[doctype] | |||
element *misc | |||
declaration | = | <?xml version | Magic |
[encoding] | |||
[standalone]?> | |||
version | = | version="1.1)" | Version |
encoding | = | encoding="UTF-8" | Zeichenkodierung |
standalone | = | standalone="yes" | |
misc | = | comment | pi | stylesheet | |
stylesheet | = | <?xml-stylesheet type href | |
[title] | |||
[media] | |||
[charset] | |||
[alternate]?> | Darstellung | ||
type | = | type="text/xsl" | |
href | = | href="uri" | |
title | = | title="qstring" | |
media | = | media="screen" | |
charset | = | charset="UTF-8" | |
alternate | = | alternate="yes" | |
doctype | = | <!DOCTYPE name | Wurzelelementname |
( | PUBLIC identifier uri | Registrierte DTD | |
| | SYSTEM uri | Lokale DTD | |
| | [dtd] | Eingebettete DTD | |
) | > | ||
identifier | = | "-//W3C//DTD XHTML 1.1//EN" | Katalogschluessel |
uri | = | "qstring" | Dokumenttyp-Definition |
element | = | emptytag | |
| | starttag content endtag | ||
emptytag | = | <name *attribute/> | |
starttag | = | <name *attribute> | |
endtag | = | </name> | |
attribute | = | name="qstring" | |
content | = | *( *CHAR | |
| | cdata | ||
| | entityref | ||
| | comment | ||
| | pi | ||
| | element) | ||
cdata | = | <![CDATA[*CHAR]]> | |
entityref | = | &name; | Konstante |
comment | = | <!-- *CHAR --> | Kommentar |
pi | = | <? *CHAR ?> | Verarbeitungsanweisung |
qstring | = | *CHAR | Attribut |
name | = | ALPHA *(ALPHA|IGIT|_|-|:) | Bezeichner |
Eine DTD legt die Struktur eines XML-Dokuments fest. Sie kann zwar in das Dokument eingebettet werden, meistens ist es jedoch sinnvoller, einer separate Datei für eine Familie von Dokumente zu erstellen.
hello.dtd<?xml version="1.0"?> <!ELEMENT article (title, section*)> <!ELEMENT section (title, para*)> <!ELEMENT title (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ATTLIST para label ID #IMPLIED class CDATA; #IMPLIED >
Auch hierzu die formale Syntax:
Nicht-Terminal | Terminale | Kommentar | |
dtd | = | *( entity / element / attlist / comment) | |
entity | = | <!ENTITY name [ SYSTEM / PUBLIC ] qstring > | |
element | = | <!ELEMENT name content > | |
attlist | = | <!ATTLIST name *attribute > | |
comment | = | <!-- *CHAR --> | |
content | = | name | Genau dieses Element |
/ | EMPTY | Keine Kindelemente | |
/ | ANY | Beliebige Kindelemente | |
/ | #PCDATA | Beliebige Textknoten | |
/ | content ? | Kein oder ein Kindelement | |
/ | content * | Kein oder mehr Kindelemente | |
/ | content + | Ein oder mehr Kindelemente | |
/ | content , content | Liste | |
/ | content | content | Alternative | |
/ | ( content ) | Gruppierung | |
attribute | = | name type value | |
type | = | CDATA | |
/ | ID | ||
/ | IDREF | ||
/ | IDREFS | ||
/ | NMTOKEN | ||
/ | NMTOKENS | ||
/ | ENTITY | ||
/ | ENTITIES | ||
/ | NOTATION | ||
/ | NOTATIONS | ||
value | = | #REQUIRED | verpflichtend |
/ | #IMPLIED | optional | |
/ | #FIXED qstring | genau dieser Wert | |
/ | qstring | optional mit default |
Ein XPath selektiert Teilmengen innerhalb eines XML-Dokuments.
Folgende Achsen teilen das Dokument in disjunkte Teilmengen:
Nicht-Terminal | Terminale | Beschreibung | |
---|---|---|---|
xpath | /relative | Absoluter Pfad von der Wurzel aus | |
relative/…/step | Relativer Pfad vom aktuellen Kontextknoten aus | ||
step | axis::test[predicate]… | Auswahlkriterien | |
axis | @ | entspricht attribute:: | |
. | entspricht self::node() | ||
.. | entspricht parent::node() | ||
// | entspricht /descendant-or-self::node()/ | ||
attribute | Alle Attribute (Attribute sind KEINE Kinder) | ||
namespace | Namensraum | ||
self | Nur der Kontextknoten | ||
parent | Der Elternknoten | ||
child | Direkte Kindknoten ohne Enkel | ||
ancestor | Alle direkten Vorfahren | ||
ancestor-or-self | Alle direkten Vorfahren inklusive Kontextknoten | ||
descendant | Alle Nachfahren | ||
descendant-or-self | Alle Nachfahren inklusive Kontextknoten | ||
following | Alle Element ab dem Kontextknoten | ||
following-sibling | Jüngere Geschwister | ||
preceding | Alle Element bis zum Kontextknoten außer den direkten Vorfahren | ||
preceding-sibling | Ältere Geschwister | ||
test | *CHAR | Nur Knoten mit diesem Namen | |
node() | Alle 7 Knotentypen außer Attribute | ||
text() | Nur Textknoten | ||
comment() | Nur Kommentare | ||
processing-instruction(…) | Nur Verarbeitungsanweisungen | ||
predicate | number | Index in der ausgewählten Knotenmenge | |
function | |||
step rel-op qstring | Vergleich | ||
function | nodeset-function | Knotenmengen | |
string-function | Textverarbeitung | ||
boolean-function | Wahrheitslogik | ||
numeric-function | Arithmetik | ||
rel-op | < | > | <= | >= | = | != | Relationale Operatoren | |
and | or | Boolesche Operatoren | ||
arith-op | + | - | * | div | mod | Arithmetische Operatoren | |
number | *DIGIT | Numeral | |
qstring | DQUOTE *CHAR DQUOTE | Zeichenkette |
Knotenmenge | |||
---|---|---|---|
number | last | () | Anzahl der Knoten im Auswertungskontext |
number | position | () | Index des aktuellen Knotens |
number | count | (node-set) | Anzahl der Elemente |
string | local-name | (node-set) | Element- oder Attributname ohne Namensraum-Präfix |
string | namespace-uri | (node-set) | Namensraum als URL |
string | name | (node-set) | Präfix und Elementname |
node-set | id | (object) | Alle Knoten mit der ID des Objekts |
Zeichenkette | |||
string | string | (object) | Interpretiert Inhalt als Zeichenkette |
string | concat | (string, …) | Hängt Inhalte aneinander |
boolean | starts-with | (string, prefix) | Prüft ein Präfix |
boolean | contains | (string, substr) | Prüft auf Teilmenge |
string | substring-before | (string, sep) | Liefert Bereich vor einem Trennzeichen |
string | substring-after | (string, sep) | Liefert Bereich nach einem Trennzeichen |
string | substring | (string, number, number) | Schneidet Teilmenge heraus |
number | string-length | (string) | Zählt die Anzahl der Zeichen |
string | normalize-space | (string) | Fasst Leerzeichen zusammen |
string | translate | (string, from, to) | Ersetzt einzelne Zeichen |
Wahrheitslogik | |||
boolean | boolean | (object) | Interpretiert Inhalt als Wahrheitswert |
boolean | not | (boolean) | Invertiert einen Wahrheitswert |
boolean | true | () | Liefert immer Wahr |
boolean | false | () | Liefert immer Falsch |
boolean | lang | (string) | Prüft die Landessprache des Kontextknotens |
Algebra | |||
number | number | (object) | Interpretiert Inhalt als Zahl |
number | sum | (node-set) | Addiert numerisch interpretierte Inhalte |
number | ceiling | (number) | Liefert nächstgrößere Ganzzahl |
number | floor | (number) | Liefert nächstkleinere Ganzzahl |
number | round | (number) | Rundet zur nächstliegenden Ganzzahl |
XPointer bieten einen standartisierte Syntax, um in
URLs auf Teile innerhalb eines
XML-Dokuments zu verweisen.
Die Funktion range
erweitert XPath um die Möglichkeit, Substrings
in Textknoten zu identifizieren.
Nicht-Terminal | Terminale | Kommentar | |
xpointer | = | xpointer (Xpath *range) | Element mit allen Kinden |
range | = | range (Xpath) | Element mit umgebenden Elementen |
= | range-inside (Xpath) | Element ohne umgebende Elemente | |
= | range-to (Xpath) | ||
= | string-range (Xpath, string, first, last) |
XLink erweitert die Syntax um Attribute, um Dokumente zueinander in Beziehung zu setzen.
Nicht-Terminal | Terminale | Kommentar | |
xlink | = | href | |
| | role | ||
| | title | ||
| | type | ||
| | show | ||
| | actuate | ||
href | = | xlink:href=uri | |
role | = | xlink:role=uri | |
title | = | xlink:title=qstring | |
type | = | xlink:type= | |
( | "simple" | ||
| | "extended" | ||
| | "locator" | ||
| | "arc" | ||
| | "title" | ||
| | "resource") | ||
show | = | xlink:show= | |
( | "new" | Zieldokument in Neuem Fenster öffnen | |
| | "replace" | Zieldokument ins aktuellen Fesnter laden | |
| | "embed" | Zieldokumenet einbetten | |
| | "other" | Verhalten wird durch andere Elemente gesteuert | |
| | "none") | Anwendung entscheidet | |
actuate | = | xlink:actuate= | |
( | "onLoad" | Link beim Laden folgen | |
| | "onRequest" | Link auf Anfrage folgen | |
| | "other" | Verhalten wird durch andere Elemente gesteuert | |
| | "none") | Anwendung entscheidet |
XSL beschreibt die Transformation von XML-Dokumenten in andere XML-Dialekte wie zum Beispiel XHTML oder beliebige andere Datenformate.
Ein
XSLT-Prozessor
wie xsltproc(1)
führt die Transformation aus. Dieser
sucht, beginnend beim Wurzelknoten, das am besten passendes Template
und führt es aus. Zum Beispiel:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <!-- root --> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> </xsl:stylesheet>
Die Funktion xsl:apply-templates
iteriert über alle Kinder des aktuellen Knotens, sucht wiederum
das am besten passende Template und ruft dieses auf. Folgendes
Template ist implizit fest eingebaut. Es traversiert alle Kinder
des aktuellen Knotens und gibt den Inhalt aller Textknoten aus.
<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template>
Element | Inhalt | Beschreibung | ||
Wurzelelement | ||||
---|---|---|---|---|
xsl:transform | Alternativer Name | |||
xsl:stylesheet | xsl:include* xsl:import* | Wurzelelement | ||
top-level-elements | ||||
version | 1.0 | 2.0 | XSL-Version | ||
id | ID | Eindeutiger Bezeichner | ||
extension-element-prefixes | Prefix … | Elemente aus den aufgelisteten Namensräumen sind Erweiterungen | ||
exclude-result-prefixes | Prefix … | Elemente aus den aufgelisteten Namensräumen nicht ausgeben | ||
xsl:include | Stylesheet mit gleicher Priorität einbinden | |||
href | Url | |||
xsl:import | Stylesheet mit geringerer Priorität einbinden | |||
href | Url | |||
Oberste Ebene | ||||
xsl:output | Steuert das Verhalten des XSLT Prozessors | |||
method | xml | html | xhtml | text | Ausgabeformat | ||
version | 1.0 | |||
encoding | UTF-8 | ISO-8859-1 | … | Zeichenkodierung der Ausgabe | ||
omit-xml-declaration | yes | no | Unterdrückt die XML-Deklaration | ||
standalone | yes | no | standalone -Attribute in der XML-Deklaration | ||
doctype-public | Qstring | PUBLIC -Identifier in der DTD | ||
doctype-system | Qstring | SYSTEM -Identifier in der DTD | ||
cdata-section-elements | Qname … | Textknoten als CDATA -Sektion ausgeben | ||
indent | yes | no | Einrückung des Ausgabedokuments | ||
media-type | text/xml | text/html | … | MIME-Typ des Ausgabedokuments | ||
name | Qname | |||
byte-order-mark | yes | no | |||
escape-uri-attributes | yes | no | |||
include-content-type | yes | no | |||
media-type | String | |||
normalization-form | none | NFC | NFD | NFKC | NFKD | |||
fully-normalized | NMtoken | ||||
undeclare-prefixes | yes | no | |||
use-character-maps | Qnames | |||
xsl:namespace-alias | Ersetzt Namensraum-Präfixe in Elementen | |||
stylesheet-prefix | Prefix | #default | Alter Name | ||
result-prefix | Prefix | #default | Neuer Name | ||
xsl:strip-space | Leerzeichen normalisieren. | |||
elements | Token … | Standardmäßig bei allen Elementen | ||
xsl:preserve-space | Leerzeichen unverändert ins Ausgabedokument übernehmen. | |||
elements | Token … | |||
xsl:attribute-set | (xsl:attribute)* | Definiert Attribute zur Verwendung in <xsl:element> | ||
name | Qname | Identifikation | ||
use-attribute-sets | Qname … | Bindet weitere Attributmengen ein | ||
xsl:variable | Element | Definiert eine Variable | ||
name | Qname | Name der Variable, wird mit $… referenziert | ||
select | Xpath | Wert der Variable | ||
xsl:decimal-format | Element | Muster für die Umwandlung von Gleitpunktzahlen in format-number() | ||
name | Qname | Identifikation; Das Muster wird zur Vorgabe, wenn dieses Attribut fehlt | ||
decimal-separator | Char | Trennzeichen für Dezimalstellen, Vorgabe ist . | ||
grouping-separator | Char | Trennzeichen für Gruppen, Vorgabe ist , | ||
infinity | String | Symbol für Unendlich, Vorgabe ist infinity | ||
minus-sign | Char | Präfix für negative Zahlen, Vorgabe ist - | ||
NaN | String | Symbol für Nicht-Zahl, Vorgabe ist NaN | ||
percent | Char | Symbol für Prozent, Vorgabe ist % | ||
per-mille | Char | Symbol für Promille | ||
zero-digit | Char | Symbol für die Null und Basis für andere Ziffern, Vorgabe ist 0 | ||
digit | Char | Zeichen für Muster, Vorgabe ist # | ||
pattern-separator | Char | Trennzeichen für positive und negative Submuster, Vorgabe ist ; | ||
xsl:key | Element mit einem Schlüssel aus. | |||
name | Qname | Ankername für key() | ||
match | Pattern | |||
use | Xpath | |||
xsl:template | (xsl:param)* Element | Funktion | ||
match | Pattern | Muster für die Auswahl des Templates bei <xsl:apply-templates> | ||
name | Qname | Marke für Referenzierung, zum Beispiel durch <xsl:call-template> | ||
mode | Token … | Unterscheidet Funktionen für dasselbe Muster | ||
priority | Number | Gewichtung für <xsl:include> und <xsl:import> | ||
as | Sequence | |||
xsl:param | Element | Parameterliste der Funktion, Vorgabewert, wenn select Attribut leer ist | ||
name | Qname | Variablenname, Wert wird mit {$name} ausgegeben. | ||
select | Xpath | Vorgabewert | ||
Kontrollfluss | ||||
xsl:apply-imports | Ruft Funktionen aus mit <xsl:import> importierten Stylesheets auf | |||
xsl:apply-templates | (xsl:sort | xsl:with-param)* | Ruft Funktionen für alle selektierten Knoten auf | ||
select | node-set | Default: Alle Kinder des Kontextknotens | ||
mode | Qname | Wählt die Funktion anhand des mode -Attributs aus | ||
xsl:call-template | xsl:with-param | Ruft Funktion für den Kontextknoten auf | ||
name | Qname | Name der Funktion | ||
xsl:with-param | Element | Parameter für den Aufruf einer Funktion | ||
name | Qname | Name des Parameters | ||
select | Xpath | Wert des Parameter, Inhalt muss leer sein | ||
xsl:if | Element | Bedingter Einschluss | ||
test | boolean | Kriterium | ||
xsl:choose | (xsl:when+) (xsl:otherwise?) | Fallunterscheidung | ||
xsl:when | Element | Spezifischer Fall | ||
test | boolean | Kriterium | ||
xsl:otherwise | Element | Allgemeiner Fall | ||
xsl:for-each | Element | Iteriert über Knotenliste | ||
select | node-set | XPath zur Auswahl der Knotenmenge | ||
separator | String | Trennzeichen für Listenausgabe | ||
disable-output-escaping | yes | no | @todo | ||
xsl:sort | Sortiert eine Knotenliste | |||
select | string | Sortierkriterium | ||
lang | en | de | … | Kultureller Kontext | ||
data-type | text | number | … | Alphabetisch oder numerisch sortieren | ||
order | ascending | descinding | Reihenfolge aufsteigend oder absteigend | ||
case-order | upper-first | lower-first | Groß- vor Kleinbuchstaben oder umgekehrt | ||
collation | uri | |||
stable | yes | no | |||
xsl:fallback | Element | Alternative für nicht unterstützte Erweiterungen | ||
xsl:message | Element | Sendet Nachricht an den XSLT-Prozessor | ||
terminate | yes | no | XSL-Verarbeitung abbrechen | ||
Ausgabe | ||||
xsl:value-of | Fügt den Textinhalt eines Knotens ein, abhängig vom Knotentyp | |||
select | string | XPath-Ausdruck | ||
disable-output-escaping | yes | no | Zeichen wie < und & nicht automatisch ersetzen. | ||
xsl:text | Element | Gibt Text aus, ohne den Leerraum zu normalisieren | ||
disable-output-escaping | yes | no | Zeichen wie < und & nicht automatisch ersetzen. | ||
xsl:element | Element | Gibt ein Element aus | ||
name | Qname | Elementname | ||
namespace | Url | Namensraum | ||
use-attribute-sets | Qname … | Sammlung von Attributen | ||
xsl:attribute | Element | Fügt dem übergeordneten Element ein Attribut hinzu | ||
name | Qname | Attributname | ||
namespace | Url | Namensraum | ||
xsl:comment | ||||
xsl:processing-instruction | ||||
name | Qname | |||
xsl:copy | Kopiert den aktuellen Knoten ins Ausgabedokument | |||
use-attribute-sets | Qname … | Sammlung von Attributen | ||
xsl:copy-of | Kopiert den selektierten Teilbaum ins Ausgabedokument | |||
select | Xpath | |||
xsl:number | – | Gibt eine Zahl aus | ||
value | number | Numerischer XPath-Ausdruck | ||
level | single | multiple | any | Modus für die Summenbildung | ||
count | Pattern | Abzahl passender Knoten auf dem entsprechenden level | ||
from | Pattern | Legt den Startknoten für die Zählung fest | ||
format | 1 | 01 | A | a | i | I | Startzeichen für die Zählung | ||
lang | en | de | … | Sprachcode für den kulturellen Kontext. | ||
letter-value | alphabetic | traditional | Alphabtisch, um z.B. I, J, K zählen zu können | ||
grouping-separator | Char | Trennzeichen für Tausender-Gruppen | ||
grouping-size | Number | Im Dezimalsystem sind Dreiergruppen üblich | ||
Neu | ||||
xsl:sequence | ||||
select | Xpath | |||
xsl:for-each-group | ||||
select | Xpath | |||
group-by | Xpath | |||
group-adjacent | Xpath | |||
group-starting-with | Pattern | |||
group-ending-with | Pattern | |||
collation | Url | |||
xsl:analyze-string | ||||
select | Xpath | |||
regex | String | |||
flags | String | |||
xsl:matching-substring | Element | |||
xsl:non-matching-substring | Element | |||
xsl:import-schema | ||||
namespace | Url | |||
schema-location | Url | |||
xsl:next-match | Element | |||
xsl:character-map | ||||
name | Qname | |||
use-character-maps | Qname … | |||
xsl:namespace | Element | |||
name | NCname | |||
select | Xpath | |||
xsl:perform-sort | Element | |||
select | Xpath | |||
Universal | ||||
Template | Text | Element erzeugen, Leerraum im Text normalisieren. | ||
Attribute | …{Xpath}… | Geschweiften Klammern durch Ergebnis des Ausdrucks ersetzten. |
Prüfe Validität gegen die im Dokument angegebene Dokumettyp-Definition
xmllint --noout File.xml
Prüfe Validität gegen RelaxNG-Schema
xmllint --noout --relaxng File.rng File.xml
Formatiere neu und rücke ein
XMLLINT_INDENT=" " xmllint --format File.xml
Konvertiere HTML nach XML
xmllint --html --xmlout File.html > File.xhtml
Transformiere mit dem im Dokument angegebenen Stylesheet
xsltproc File.xml
Transformiere mit externem Stylesheet
xsltproc File.xsl File.xml
Extrahiere einen Knotensatz mit XPath
xpath -e Expression File.xml
Flache Hierarchie aller Knoten in XPath-Ausdrücke ab
xml2 < data.xml