Websiteentwicklung: XSLT: Überblick Struktur

Aus Wikibooks

Dies Kapitel bietet einen kurzen Überblick über Elemente, Attribute und Funktionen von XSLT, die Auswahlmechanismen von XPath sind in einem eigenen Kapitel Auswahl behandelt.

Für die Inhaltsmodelle der Elemente wird jeweils eine Kurznotation verwendet, wie sie in DTDs üblich ist. Kommt es auf die Reihenfolge an, so werden Elemente mit Komma separiert.
Mit Klammern '()' kann gruppiert werden.

  • Der Inhalt kann optional in beliebiger Häufigkeit vorkommen, also auch gar nicht, einmal oder mehrmals.

+ Der Inhalt kommt mindestens einmal vor.
? Der Inhalt tritt entweder exakt einmal auf oder keinmal.

Ansonsten werden die Elemente von XSLT zu Gruppen zusammengefaßt, solche Gruppen werden dann im Inhaltsmodell nur noch mit dem Gruppennamen erwähnt, um sie hier als spezifische Gruppenamen kenntlich zu machen, ist dem Namen jeweils ein % vorangestellt. Interpretierter Text wird PCDATA genannt.

Gruppen:

%Zeichen-Instruktion
apply-templates | call-template | apply-imports | for-each | value-of | copy-of | number | choose | if | text | copy | variable | message | fallback
%Instruktion
%Zeichen-Instruktion | processing-instruction | comment | element | attribute
%Zeichenvorlage
(PCDATA %Zeichen-Instruktion)*
%Vorlage
(PCDATA | %Instruktion | %Ergebnis)*
%Ergebnis
Notation für Strukturen der Ausgabeformate, das kann zum Beispiel einfacher interpretierter Text sein, Elemente aus anderen Namensräumen oder aus dem Null-Namensraum.
%Fremd
Kindelemente des Wurzelelementes, die nicht zum Namensraum von XSLT gehören, also einem fremden Namensraum angehören, insbesondere auch nicht ausgegeben werden.

Sofern nicht anders angegeben, können natürlich von XML allgemein vordefinierte Attribute aus dem XML-Namensraum verwendet werden, insbesondere sind Namensraumangaben wichtig. Einmal abgesehen von einer Namensraumzuordnung von Elementen und Attributen wirken diese allgemeinen XML-Attribute allerdings nur auf die Stilvorlagendatei und werden nicht in die Ergebnisdatei übertragen, für diese müssen sie wieder explizit in den Vorlagen als Attribute gesetzt werden.


Wurzelelemente stylesheet und transform[Bearbeiten]

Inhaltsmodell für die Wurzelelemente:
Diese können Elemente %Fremd aus anderen Namensräumen enthalten, die allerdings nicht zum Ergebnis beitragen. Diese können etwa einer strukturierten Dokumentation der Stilvorlage dienen.
Ansonsten formal:

import*, (include | strip-space | preserve-space | output | key | decimal-format | attribute-set | variable | param | template | namespace-alias | %Fremd)*

Die Wurzelelemente haben mehrere für sie spezifische Attribute:

Fragmentidentifizierer, Attribut id[Bearbeiten]

Die Bedeutung dieses Attributes entspricht der von xml:id, stellt also einen Fragmentidentifizierer dar. Benötigt wird dies Attribut insbesondere, wenn man etwa die Stilvorlage als Fragment in das Quelldokument (oder ein anderes Dokument) einbettet und dann per XML-Stilvorlagenverarbeitungsdatei referenzieren möchte.

Das Attribut ist optional.

Versionskennung, Attribut version[Bearbeiten]

Mit diesem erforderlichen Attribut wird angegeben, welche Version von XSLT benutzt wird. Der Wert ist in der jeweiligen Version festgelegt. Für Version 1 gilt der Wert '1.0', für Version 2 gilt der Wert '2.0', für Version 3 gilt voraussichtlich der Wert '3.0'.

Attribut extension-element-prefixes[Bearbeiten]

XSLT kann um bestimmte Elemente aus anderen Namensräumen erweitert werden, um zu kennzeichnen, dass diese zur Stilvorlage gehören und nicht zur Ausgabe, sind die Präfixe dieser Namensräume mit dem Attribut extension-element-prefixes anzugeben. Der Wert dieses Attributes ist eine durch Leerräume getrennte Liste von Namensraum-Präfixen.

Wird dem Attributnamen explizit das für XSLT verwendete Präfix vorangestellt, kann es auch bei anderen Elementen notiert werden, die zur Erweiterung oder zu auszugebenden Elementen gehören.

Attribut exclude-result-prefixes[Bearbeiten]

Elemente aus anderen Namensräumen, die mit einem Präfix gekennzeichnet sind, können auch ohne Namensraumzuordnung ausgegeben werden. Dazu dient das Attribut exclude-result-prefixes. Der Wert dieses Attributes ist eine durch Leerräume getrennte Liste von Namensraum-Präfixen. Für den voreingestellten Namensraum kann das Schlüsselwort '#default' verwendet werden.

Wird dem Attributnamen explizit das für XSLT verwendete Präfix vorangestellt, kann es auch bei anderen Elementen notiert werden, die zur Erweiterung oder zu auszugebenden Elementen gehören.

Dies kann etwa nützlich sein, wenn man im Quelldokument oder im Stilvorlagen-Dokument eine Namensraumzuordnung samt Präfix hat, um etwas eindeutig zu selektieren, dies aber in der Ausgabe nicht mehr braucht, welche den Namensraum anderweitig festlegt oder wenn die Ausgabe im Null-Namensraum erfolgen soll.


Stilvorlage importieren oder einbinden, import und include[Bearbeiten]

Mit den inhaltsleeren Elementen import und include können optional weitere XSLT-Stilvorlagendokumente referenziert werden, welche weitere Vorlagen enthalten. Elemente vom Typ import stehen immer als erste Kindelemente im Wurzelelement.

Das Element include wird vor der Verarbeitung der Stilvorlage jeweils durch die Kindelemente des Wurzelelementes der eingebundenen XSLT-Stilvorlage ersetzt. Bei der Ersetzung werden gegebenenfalls weitere importierte Elemente import nach oben vor andere Elemente verschoben, direkt hinter bereits vorhandene Elemente import. Entsprechend wird ein Element import durch die Kindelemente des Wurzelelementes der importierten XSLT-Stilvorlage ersetzt.

Die Angaben im importierenden oder einbindenden Dokument haben im Konfliktfalls Vorrang vor denen im per import importierten Dokument.

Ein Dokument darf sich nicht selbst direkt oder indirekt über andere importierte oder eingebundene Dokumente importieren oder einbinden, solche Zirkelschlüsse sind ein Fehler. In komplizierteren Fällen kann es allerdings vom verwendeten XSLT-Prozessor abhängen, wann solch ein unerlaubter Zirkelschluß als Fehler erkannt wird.

Attribut href[Bearbeiten]

Mit dem Attribut wird das zu importierende oder einzubettende Dokument referenziert. Der Wert des Attributes ist also eine URI eines XSLT-Dokumentes, welches eingebettet oder importiert werden soll. Das Attribut ist erforderlich


Leerzeichenbehandlung, strip-space, preserve-space[Bearbeiten]

Das inhaltsleere Element strip-space dient dazu festzulegen, bei welchen Elementen aus Sicht von HTML und XML überschüssige Leerzeichen im Quelldokument entsorgt werden sollen.

Das inhaltsleere Element preserve-space gibt umgekehrt an, bei welchen Elementen aus Sicht von HTML und XML überschüssige Leerzeichen im Quelldokument nicht entsorgt werden sollen.

Attribut elements[Bearbeiten]

Die Elemente, für die das gültig ist, können als mit Leerzeichen separierte Liste als Attributwert von elements angegeben werden. Ein Stern bedeutet alle Elemente.

Ohne eine Angabe stehen alle Elemente des Quelldokumentes in der Liste von preserve-space. Dies kann dann durch ein folgendes strip-space für eine Auswahl wieder geändert werden, entsprecht daraufhin wieder eine Änderung mit preserve-space.


Ausgabe steuern, output[Bearbeiten]

Mit dem inhaltsleeren Element kann über einige optionale Attribute die Art der Ausgabe gesteuert werden.

Sofern mehrere Elemente output notiert sind oder importiert oder eingebunden sind, werden die Angaben aller Elemente output vereint, also die Liste von cdata-section-elements umfaßt dann effektiv die Vereinigung aller Einzellisten. Bei den anderen Attributen gilt die Angabe mit der höchsten Importpriorität, also letztlich was zuletzt im Quelltext steht, nachdem importiert und eingebettet wurde.

Attribut method[Bearbeiten]

Mit dem Attribut wird die Art oder Methode der Ausgabe festgelegt. Die möglichen Werte von method sind:

'xml'
Ausgabe nach den Regeln von XML, es wird immer ein Dokument oder wenigstens Dokumentfragment ausgegeben, welches den Syntaxregeln von XML einschließlich der Berücksichtigung von Namensräumen entspricht. Dies ist die Voreinstellung, Ausnahme siehe Wert 'html'.
'text'
einfache Textausgabe, also keine Markierungen für Auszeichungselemente.
'html'
Ausgabe nach den spezifischen Regeln von HTML, dies ist die Voreinstellung wenn das Wurzelelement der Ausgabe 'html' genannt wird oder jegliche Variation mit Groß- und Kleinbuchstaben davon. Um eine XHTML-Ausgabe zu bekommen oder eine in einem anderen Format, welches zufällig ebenfalls ein Wurzelelement mit dem Namen 'html' hat, ist methode also explizit festzulegen.
eigene Methode
Eine eigene Methode kann mit einem sogenannten qualifizierten Namen erfolgen, also ein Namen, der mit einem vorangestellten Präfix einem Namensraum zugeordnet wird. Das Verhalte ist aus Sicht von XSLT dann undefiniert.

Attribut indent[Bearbeiten]

Die möglichen Werte sind 'yes' oder 'no'. Bei 'yes' wird der Ergebnisbaum so formatiert, dass untergeordnete Elemente weiter eingerückt werden. Dies hat keine Auswirkung auf die Darstellung der Ausgabe, sondern verbessert nur die Lesbarkeit des erzeugten Quelltextes. Die Voreinstellung für dieses Attributes ist für die Ausgabemethode 'xml' gleich 'no'. Die Voreinstellung für dieses Attributes ist für die Ausgabemethode 'html' gleich 'yes'.

Attribut encoding[Bearbeiten]

Mit diesen Attribut kann die Kodierung der Ausgabe festgelegt werden. Der Wert ist eine Zeichenfolge die per IANA festgelegt ist. Typische Werte sind etwa 'UTF-8', 'ISO-8859-1' oder 'ISO-8859-15'. Dies bedeutet nun nicht, dass ein XSLT-Prozessor jegliche angegebene Kodierung auch beherrschen muß, bei exotischeren Kodierungen kann es also Probleme geben. UTF-8 und UTF-16 sind allerdings immer verfügbar.

Attribut media-type[Bearbeiten]

Mit dem Attribut wird der Medientyp oder Inhaltstyp für die Ausgabe festgelegt. Typische Werte sind etwa 'text/plain', 'text/html', 'application/xml', 'application/xhtml+xml', 'application/xslt+xml', 'image/svg+xml' etc, siehe auch Medien-Typen.

Attribut doctype-public und doctype-system[Bearbeiten]

Das Attribut doctype-public dient der Angabe des öffentlichen Identifizierers für eine Dokumenttypdeklaration. Das Attribut doctype-system hat als Wert die URI der Dokumenttypdeklaration.

Hat man nur seine private DTD, so kommt offenbar nur doctype-system zum Einsatz, sonst beide. Typische Beispiele für gängige DTDs:

SVG 1.1: doctype-public="-//W3C//DTD SVG 1.1//EN" doctype-system="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"
SVG tiny 1.1: doctype-public="-//W3C//DTD SVG 1.1 Tiny//EN" doctype-system="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd"
XHTML 1.1: doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
XHTML+RDFa 1.1: doctype-public="-//W3C//DTD XHTML+RDFa 1.1//EN" doctype-system="http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd"
HTML 4.01 (strict) doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd"
HTML 4.01 (einschließlich veralteter Merkmale, Übergangsvariante)doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"

Attribut omit-xml-declaration[Bearbeiten]

Das Attribut gibt an, ob der XSLT-Prozessor eine XML-Deklaration ausgeben soll, das ist offenbar nur relevant bei der Ausgabemethode 'xml'. Der Wert ist 'yes', wenn sie weggelassen werden soll oder 'no', wenn sie nicht weggelassen werden soll. Per Voreinstellung wird die Deklaration bei der Ausgabemethode 'xml' ausgegeben.

Attribut version[Bearbeiten]

Das Attribut legt die Version des Ausgabeformates fest, bei omit-xml-declaration="no" also insbesondere die XML-Versionsangabe, in der Regel ist dies '1.0'.

Attribut standalone[Bearbeiten]

Mit dem Attribut wird festgelegt, dass der XSLT-Prozessor im Falle von omit-xml-declaration="no" zur XML-Deklaration ein Pseudoattribut standalone hinzufügen soll. Der Wert ist der des Pseudoattributes, also 'yes' oder 'no'.

Attribut cdata-section-elements[Bearbeiten]

Sofern die Ausgabe Elemente enthalten soll, die nicht interpretierten Text enthalten, können diese Elementnamen als mit Leerzeichen separierte Liste als Wert dieses Attributes notiert werden. Das heißt, der Inhalt solcher Elemente wird vom Prozessor in der Ausgabe in einem CDATA-Bereich notiert.


Schlüssel festlegen, key[Bearbeiten]

Das inhaltsleere Element key ermöglicht Kreuzreferenzierungen entsprechend den DTD-Attributtype ID,IDREF und IDREFS auch ohne eine DTD. key definiert einen Schlüssel für diesen Zweck.

Ein Schlüssel ist ein Tripel, der Folgendes enthält:

  • den Knoten, der den Schlüssel repräsentiert beziehungsweise enthält
  • den Namen des Schlüssels (ein Erweiterter Name)
  • den Wert des Schlüssels (eine Zeichenkette)

Die drei Attribute von key sind alle erforderlich.

Attribut name[Bearbeiten]

Das Attribut legt den Namen des Schlüssels fest. Der Wert ist ein qualifizierter Name, also im Bedarfsfalle mit vorangestelltem Präfix für den Namensraum.

Attribut match[Bearbeiten]

Das Attribut legt fest, auf welche Knoten der Schlüssel zutrifft. Der Wert ist eine Liste von Lokalisierungsangaben im Sinne von XPath. Dabei dient '|' als Separator mit optionalen Leerzeichen.

Attribut use[Bearbeiten]

Das Attribut enthält einen Ausdruck, der den Wert des Schlüssels angibt. Der Ausdruck wird einmalig für jeden Knoten ausgewertet, der zu dem Muster gemäß match passt.

Funktion key(string , object)[Bearbeiten]

Mit der Funktion kann ein Schlüssel verwendet werden, welcher mit dem Element 'key angelegt wurde. 'string' ist dabei der name eines Elementes 'key, der verwendet werden soll. 'object' ist dabei der zu verwendende Wert. Ja nachdem, was mit use von 'key angegeben ist, kann dies etwa ein Attributwert oder ein Elementinhalt sein.

Mit Funktion und Element werden also bestimmte Kindknoten eines aktuellen Knotens ausgewählt, wobei mit der Funktion angegeben wird, wie genau ausgewählt wird.

Beispiel zur Verwendung von key[Bearbeiten]

<xsl:key name="schluessel_p_id" match="p" use="@id"/>

Ist id vom Typ ID wie etwa xml:id, hat also sinngemäß folgenden Eintrag in der DTD:

<!ATTLIST p id ID #IMPLIED>

So liefern die Ausdrücke 'key("schluessel_p_id",@ref)' und id(@ref) die gleichen Knoten zurück.

Beispiel für eine Bibliographie; ein Quelldokument enthalte eine Kurzreferenz in der Form:

<bibref>XSLT</bibref>

und an anderer Stelle die Einträge dazu:

<bibentries>
<entry name="XSLT">...</entry>
<entry name="XHTML">...</entry>
<entry name="SVG">...</entry>
</bibentries>

Folgendes XSLT-Fragment kann verwendet werden, um Elemente bibref in den passenden Eintrag umzuwandeln:

<xsl:key name="bib" match="entry" use="@name"/>

<xsl:template match="bibref">
  <xsl:variable name="name" select="."/>
  <xsl:for-each select="bibentries">
    <xsl:apply-templates select="key('bib',$name)"/>
  </xsl:for-each>
</xsl:template>


Zahlenformatierung, decimal-format[Bearbeiten]

Das inhaltsleere Element decimal-format deklariert ein Dezimalformat, mit welchem eine Zahlenausgabe formatiert werden kann, wozu dann die Funktion 'format-number' verwendet wird. Die Formatierung folgt dabei der Methode von Java, wie in JDK 1.1 definiert.

Attribut name[Bearbeiten]

Der Wert von name ist ein qualifizierter Name eines bereits vorhandenen Dezimalformates, der Name ist also etwa per Präfix einem Namensraum zugeordnet.

Attribut decimal-separator[Bearbeiten]

Das Attribut gibt das Zeichen an, welches als Dezimal-Zeichen verwendet wird. Voreinstellung ist ein Punkt '.'. Bei der Voreinstellung wird hier also wie üblich der englischen Notation für Zahlen gefolgt, nicht der deutschen, bei Bedarf kann man mit dem Attribut also auf eine andere Notation umschalten. Jedenfalls wenn die Daten von anderen Programmen weiterverwendet werden sollen, impliziert ein Abweichen von der Voreinstellung in der Regel dann aber weitere Probleme.

Attribut grouping-separator[Bearbeiten]

Das Attribut gibt das Zeichen an, welches zur Trennung von Gruppen verwendet wird; der Voreinstellung ist ein Komma ','. Jedenfalls wenn die Daten von anderen Programmen weiterverwendet werden sollen, ist dringend zu empfehlen, keine Gruppierung vorzunehmen, also den Wert leer zu setzen, sonst ist mit weiteren Problemen zu rechnen.

Attribut percent[Bearbeiten]

Das Attribut gibt das Zeichen an, welches als Prozentzeichen verwendet wird, also als Einheit für 1/100. Voreinstellung ist das Prozentzeichen '%'.

Attribut per-mille[Bearbeiten]

Das Attribut gibt das Zeichen an, welches als Zeichen für 1/1000 als Einheit verwendet wird. Voreinstellung ist das das Zeichen ‰, als numerische Entität: &#x2030;.

Attribut zero-digit[Bearbeiten]

Das Attribut gibt das Zeichen an, welches als Ziffer Null verwendet wird. Voreinstellung der ist die Ziffer Null '0'.

Attribut digit[Bearbeiten]

Das Attribut gibt das Zeichen an, welches für eine Ziffer im Formatmuster verwendet wird. Voreinstellung ist das Zeichen Doppelkreuz '#'.

Attribut pattern-separator[Bearbeiten]

Das Attribut gibt das Zeichen an, welches verwendet wird, um positive und negative Untermuster in einem Muster zu trennen. Voreinstellung ist das Semikolon ';'.

Attribut infinity[Bearbeiten]

Das Attribut gibt das Zeichen an, welches unendlich repräsentiert. Voreinstellung ist die Zeichenkette 'Infinity'. Sinnvoller ist vermutlich meist das mathematische Symbol für unendlich: ∞, als Entität: &#x221E;.

Attribut NaN[Bearbeiten]

Das Attribut gibt das Zeichen an, welches den NaN-Wert, als keine Zahl repräsentiert. Voreinstellung ist die Zeichenkette 'NaN'.

Attribut minus-sign[Bearbeiten]

Das Attribut gibt das Zeichen an, welches als Minuszeichen verwendet wird. Voreinstellung ist der Bindestrich-Minus '-', &#x2D;.

Funktion 'format-number'[Bearbeiten]

Mit der Funktion können mittels decimal-format formatierte Zahlen in einer Vorlage verwendet werden.

Der Aufruf erfolgt mit zwei oder drei Parametern: format-number(Wert, Muster, Name?). Dabei ist 'Wert' der Eingabezahlenwert, 'Muster' ist ein Muster gemäß Java JDK 1.1, nach welchem formatiert wird. Wird der optionale Parameter 'Name' verwendet, so ist dessen Wert der name eines decimal-format, welches dann verwendet wird.


Variablen und Parameter, variable und param[Bearbeiten]

In XSLT können auch Variablen und Parameter verwendet werden. Das Attribut name ist jeweils erforderlich.

Das Element ist entweder inhaltsleer oder enthält seinen Wert als Inhalt in Form einer %Vorlage. Allgemein ist der Wert ein Objekt vom Typ eines Ausdrucks. param liefert einen Vorgabewert.

Attribut name[Bearbeiten]

Der Wert von name ist ein qualifizierter Name, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Der Parameter oder Variable werden dann mit diesem Namen referenziert.

Attribut select[Bearbeiten]

Sofern der Wert nicht als Inhalt im Element steht, wird mit dem Attribut select ein Ausdruck angegeben, welcher den Wert repräsentiert. Sofern select angegeben ist, muß das Element leer sein. Ist das Element sowohl leer als auch select nicht angegeben, so ist der Wert leer, also äquivalent zu einem gesetzten select mit leerem Wert.

Beispiel zur Verwendung von variable[Bearbeiten]

<!-- Definition der Variable -->
<xsl:variable name="bsp">Variablenwert</xsl:variable>
<!-- Verwendung in einer Vorlage -->
<xsl:template match="beispiel">
<title>{$bsp}</title>
</xsl:template>

Verwendung in einem Ausdruck:

<!-- Definition der Variable -->
<xsl:variable name="bsp" select="5" />
<!-- irgendeine Vorlage -->
  <xsl:value-of select="item[$bsp]"/>
<!-- Ende irgendeiner Vorlage -->


Attributsatz, attribute-set[Bearbeiten]

Mit dem Element kann ein Satz von Attributen vordefiniert werden, welcher dann mittels des Attributes use-attribute-sets des Elementes copy verwendet werden kann, alternativ auch mit attribute-set selbst.

Gibt es - etwa durch importieren - mehrere gleichnamige Sätze von Attributen, so werden diese miteinander vereint, wobei die üblichen Prioritäten gelten.

Inhaltsmodell: Optionaler Inhalt von attribute-set sind Elemente attribute in beliebiger Anzahl.

Attribut name[Bearbeiten]

Der Wert von name ist ein qualifizierter Name, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Das Attribut ist erforderlich. Der Attributsatz wird dann mit diesem Namen referenziert.

Attribut use-attribute-sets[Bearbeiten]

Mit dem Attribut können andere Attributsätze referenziert werden. Zirkelschlüssel, direkt oder indirekt sind nicht erlaubt und ein Fehler. Der Wert ist eine mit Leerzeichen separierte Liste von Namen gemäß dem Attribut name des jeweiligen Elementes attribute-set. Der jeweils referenzierte Attributsatz wird dann in den referenzierenden eingefügt.

Wird so ein Attribut mehrfach verwendet, entscheidet die Reihenfolge, welche Angabe vorherige überschreibt. ein späterer Listeneintrag überschreibt vorherige. Enthält das Element attribute-set ferner zusätzlich Elemente attribute, so gelten diese als später notiert als jene, die per use-attribute-sets referenziert werden.

Wird in einer Vorlage per copy ein attribute-set referenziert und in der Vorlage ein gleichnamiges Attribut per Element attribute gesetzt, so hat dies Vorrang von dem gleichnamigen referenzierten Attribut.


Ersatz für einen Namensraum, namespace-alias[Bearbeiten]

Mit dem Element kann ein Ersatznamensraum angegeben werden, was insbesondere relevant ist, wenn Elemente aus dem Namensraum von XSLT selbst in der Ausgabe auftreten.

Für den zu ersetzenden Namensraum und den Ersatz werden zunächst jeweils Präfixe festgelegt. Mit den beiden Attributen des Elementes wird dann festgelegt, welcher Namensraum durch welchen zu ersetzen ist.

Das Element ist inhaltsleer. Erforderlich sind beide Attribute stylesheet-prefix und result-prefix.

Attribut stylesheet-prefix[Bearbeiten]

Mit dem Attribut wird angegeben, welcher Namensraum zu ersetzen ist. Wert ist das Präfix, welches den Namensraum repräsentiert. Der voreingestellte Namensraum kann zudem mit der Zeichenkette '#default' selektiert werden. Ein leerer Wert kennzeichnet den Null-Namensraum.

Attribut result-prefix[Bearbeiten]

Mit dem Attribut wird angegeben, welcher Namensraum in der Ausgabe erscheinen soll. Wert ist das Präfix, welches den Namensraum repräsentiert. Der voreingestellte Namensraum kann zudem mit der Zeichenkette '#default' selektiert werden. Ein leerer Wert kennzeichnet den Null-Namensraum.

Beispiel zur Verwendung von namespace-alias[Bearbeiten]

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

<xsl:namespace-alias stylesheet-prefix="a" result-prefix="xsl"/>
<xsl:template match="/">
  <axsl:stylesheet>
    <xsl:apply-templates/>
  </axsl:stylesheet>
</xsl:template>

<!-- etc ... -->
</xsl:stylesheet>

Das erzeugt also ein Wurzelelement stylesheet im Namensraum von XSLT.


Vorlagenregel, template[Bearbeiten]

Mit Vorlagenregeln wird die Ausgabe gesteuert, beziehungsweise welche Strukturen der Eingabe in welche der Ausgabe transformiert werden.

Inhaltsmodell:
(PCDATA | %Instruction | %Ergebnis | param)*

template hat einige optionale Attribute. Damit eine Vorlagenregel allerdings überhaupt angewendet werden kann, ist mindestens die Angabe eines Attributes notwendig.

Muster match[Bearbeiten]

Mit dem Attribut wird ein Muster gemäß XPath angegeben, trifft das Muster zu (daher der englische Name), so wird die Regel angewendet oder umgedreht, sie wird auf alle Strukturen (Elemente) in der Eingabe angewendet, auf welche das Muster zutrifft. Die genaue Struktur dieser Auswahl wird in einem anderen Kapitel dieses Buches betrachtet und auch in zahlreichen Beispielen genauer erläutert.

Attribut name[Bearbeiten]

Der Wert von name ist ein qualifizierter Name, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Das Attribut ist erforderlich. Die Vorlagenregel wird dann mit diesem Namen referenziert, um sie zur Anwendung zu bringen. Der Aufruf oder die Referenzierung erfolgt dann mit dem Element call-template, welches ein Attribut name mit demselben qualifizierten Namen als Wert hat.

Modus mode[Bearbeiten]

Mit dem Attribut kann es ermöglicht werden, eine Vorlagenregel mehrmals zu verarbeiten. Der Wert des Attributes ist ein qualifizierter Name. Das Attribut darf nur verwendet werden, wenn auch match notiert ist. Der Aufruf oder die Referenzierung der Vorlagenregel erfolgt dann mit einem Element apply-templates, welches ein Attribut mode mit demselben qualifizierten Namen als Wert hat.

Priorität priority[Bearbeiten]

Da mehrere Vorlagenregeln zutreffen können, aber nur jene mit der höchsten Priorität wirksam wird, kann mit dem Attribut priority die Priorität einer Regel explizit angegeben werden, statt diese automatisch aus der Position im Quelltext der Vorlagendatei bestimmen zu lassen. Der Wert ist eine Zahl (positiv, negativ, ganzzahlig oder nicht ganzzahlig), welche die Priorität angibt. Automatisch bestimmte Prioritäten liegen zwischen -0.5 und 0.5, ein Wert jenseits davon gewährleistet also eine sehr niedrige oder sehr hohe Priorität gegenüber einer automatisch bestimmten.

Beispiele Vorlagenregel[Bearbeiten]

<xsl:template match="/">
  Halli Hallo Hallöchen!
</xsl:template>

Die Vorlagenregel trifft zu auf den Wurzelknoten der Eingabe, bewirkt also als Ausgabe den angegebenen Text.

<xsl:template match="/">
  <html>
    <xsl:apply-templates mode="autorkommentar"/>
    <head>
      <xsl:call-template name="title" />
      <xsl:call-template name="meta" />
      <xsl:call-template name="link" />
    </head>
    <body>
      <xsl:call-template name="body" />
      <xsl:apply-templates />
    </body>
    <xsl:apply-templates mode="autorkommentar"/>
  </html>
</xsl:template>

<xsl:template name="title">
<!-- irgendwelche sonstigen Regeln zur Ausgabe -->
</xsl:template>
<xsl:template name="meta">
<!-- irgendwelche sonstigen Regeln zur Ausgabe -->
</xsl:template>
<xsl:template name="link">
<!-- irgendwelche sonstigen Regeln zur Ausgabe -->
</xsl:template>

<xsl:template name="body">
<!-- irgendwelche sonstigen Regeln zur Ausgabe -->
</xsl:template>

<xsl:template mode="autorkommentar" match="/*/autor" priority="1">
<!-- irgendwelche sonstigen Regeln zur Ausgabe -->
</xsl:template>

<!-- etc, weitere Regeln -->


Weitere Vorlagenregeln anwenden, apply-templates[Bearbeiten]

Das Element kann innerhalb einer %Vorlage auftreten, also insbesondere als Nachfahren von template, und dient dazu, weitere Vorlagenregeln aufzurufen.

Welche Vorlagenregeln verarbeitet werden, hängt davon ab, welches der beiden optionalen Attribute notiert wird.

Inhaltsmodell: (sort | with-param)*

Modus mode[Bearbeiten]

Mit dem Attribut kann es ermöglicht werden, eine Vorlagenregel mehrmals zu verarbeiten. Der Wert des Attributes ist ein qualifizierter Name. Es wird jene Vorlagenregel template angewendet, welche ein Attribut mode mit demselben qualifizierten Namen als Wert hat.

Modus select[Bearbeiten]

Wird dieses Attribut nicht notiert, werden weitere Vorlagen für alle Kinder des aktuellen Knotens angewendet. Ansonsten ist der Wert des Attributes ein Ausdruck gemäß XPath, mit welchem die zu verarbeitenden Kindknoten des aktuellen Knotens selektiert werden.

Weitere Vorlagenregeln importieren, apply-imports[Bearbeiten]

Anfänglich per import importierte Vorlagenregeln können innerhalb einer Vorlage (mit entsprechend hoher) Priorität zur Anwendung gebracht werden, indem in der jeweiligen Vorlagenregeln apply-imports notiert wird.

Das Element ist inhaltsleer und hat keine Attribute.

Beispiel:

<xsl:import href="animate.xsl"/>

<xsl:template match="example">
  <rect width="100" height="100">
     <xsl:apply-imports/>
  </rect>
</xsl:template>


Weitere Vorlagenregel aufrufen, call-template[Bearbeiten]

Per name benannte Vorlagenregeln template können per call-template aufgerufen werden. Dazu wird derselbe name bei call-template notiert.

Inhaltsmodell: with-param*

Attribut name[Bearbeiten]

Der Wert von name ist ein qualifizierter Name, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Das Attribut ist erforderlich. Eine Vorlagenregel mit diesem Namen wird dann mit diesem call-template referenziert, um sie zur Anwendung zu bringen.


Erzeugung eines Elementes, element[Bearbeiten]

Statt ein Element direkt in einer Vorlagenregel als Ausgabe zu notieren, kann das Element auch mit dem Element element erzeugt werden. Da ebenfalls die Namensraumzuordnung angegeben werden kann, kann man so auch entsprechende Konflikte umgehen.

Inhaltsmodell: %Vorlage

Der Inhalt gemäß %Vorlage ist dann auch in der Ausgabe der Inhalt des erzeugten Elementes. Dies sind also die Kindknoten des erzeugten Elementes. Zudem können vor diesen Kindknoten auch noch per Attributknoten des Elementes per attribute erzeugt werden.

Attribut name[Bearbeiten]

Der Wert von name ist der qualifizierte Name des Elementes, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Das Attribut ist erforderlich.

Attribut namespace[Bearbeiten]

Mit dem optionalen Attribut kann der Namensraum angegeben werden, zu welchem das Element gehört. Ist der Attributwert leer, so wird der Null-Namenraum zugeordnet, also keiner. Sofern dies Attribut angegeben ist, wird von name nur der lokale Teil verwendet, nicht das gegebenenfalls ebenfalls notierte Präfix.

Attribut use-attribute-sets[Bearbeiten]

Mit dem Attribut können zum Element Attributsätze hinzugefügt werden, welche per attribute-set definiert sind. Der Wert ist eine mit Leerzeichen separierte Liste von Namen die bei attribute-set jeweils mit dem Attribut name angegeben sind.


Erzeugung eines Attributes, attribute[Bearbeiten]

Mit dem Element kann ein Attribut definiert werden, die dann einem Element zuzuordnen sind, der zugeordnete Knoten muß also ein Element sein. Attributknoten sind vor allen anderen Kindknoten hinzuzufügen.

Inhaltsmodell: %Vorlage

%Vorlage muß dabei immer den Einschränkungen von Attributwerten unterliegen, der Inhalt des Elementes stellt also den Wert des erzeugten Attributes dar. Sofern Zeilenumbrüche im Attributwert benötigt werden, sind diese zu maskieren, also statt ihrer ist die Entität &#xA; zu notieren.

Attribut name[Bearbeiten]

Der Wert von name ist der qualifizierte Name des Attributes, der Name kann also etwa per Präfix einem Namensraum zugeordnet werden. Ist bereits ein Attribut mit demselben Namen vorhanden, wird dieses durch das neu erzeugte ersetzt. Das Attribut ist erforderlich.

Attribut namespace[Bearbeiten]

Mit dem optionalen Attribut kann der Namensraum angegeben werden, zu welchem das Attribut gehört. Ist der Attributwert leer, so wird der Null-Namenraum zugeordnet, also keiner. Sofern dies Attribut angegeben ist, wird von name nur der lokale Teil verwendet, nicht das gegebenenfalls ebenfalls notierte Präfix.

Man beachte, dass Attribute ohne Präfix zu keinen oder dem Null-Namensraum gehören. Dies ist typisch der Fall bei Attributen, deren Bedeutung im selben Format für das Element definiert werden. Anders ist das etwa bei einem Format wie XLink oder den für XML vordefinierten Attributen, die in einem eigenen Namensraum definiert sind, also nicht direkt in Zusammenhang mit dem Element, bei dem sie notiert werden.

Erzeugung von Text, text[Bearbeiten]

Ein Textknoten kann mit text erzeugt werden. Im Ergebnis werden aufeinander folgende Textknoten zu einem vereint. Text in der Ausgabe kann daneben auch direkt in einer Vorlagenregel notiert werden.

Inhaltsmodell: PCDATA

Attribut disable-output-escaping[Bearbeiten]

Zeichen in text, die mit der XML-Syntax in Konflikt stehen, können in der Ausgabe durch Entitäten ersetzt werden, um Wohlgeformtheit automatisch sicherzustellen, in der Vorlagenregel sind sie ja ohnehin zu ersetzen, weil XSLT ja selbst ein XML-Format ist.

Mit dem Attribut disable-output-escaping kann man das bei Bedarf einstellen. Möglich sind die Werte 'yes' und 'no'. 'no' bedeutet, daß der Ersatz mit Entitäten in der Ausgabe vorgenommen wird. 'yes' bedeutet, daß diese Ersetzung abgeschaltet wird.

Wird als Ausgabemethode 'text' gewählt, wird das Attribut ignoriert und es werden nie Ersetzungen vorgenommen.

Wird die Ausgabemethode 'xml' oder 'html' gewählt, so gilt als Voreinstellung 'no', also es werden automatisch Entitäten verwendet.


Erzeugung einer Verarbeitungsanweisung, processing-instruction[Bearbeiten]

Mit dem Element wird eine Verarbeitungsanweisung in der Ausgabe erzeugt, von daher nur relevant für die Ausgabemethode 'xml'.

Inhaltsmodell: %Vorlage

%Vorlage ist dabei so eingeschränkt, dass daraus der Inhalt des Verarbeitungsanweisungsknotens resultieren muß, also die in der Verarbeitungsanweisung auftretenden Pseudoattribute samt Werten.

Attribut name[Bearbeiten]

Mit dem Attribut wird der Name der Verarbeitungsanweisung angegeben, also etwa 'xml-stylesheet' für eine XML-Stilvorlagenverarbeitungsanweisung.

Beispiel zur Erzeugung von Verarbeitungsanweisungen[Bearbeiten]

<xsl:template match="/">
  <xsl:processing-instruction name="xml-stylesheet">
    href="hell.css"
    type="text/css"
    title="dunkel auf hell" 
    media="screen"
  </xsl:processing-instruction>
  <xsl:processing-instruction name="xml-stylesheet">
    href="dunkel.css" 
    type="text/css" 
    title="hell auf dunkel" 
    media="screen" 
    alternate="yes"
  </xsl:processing-instruction>
  <xsl:processing-instruction name="xml-stylesheet">
    href="kein.css" 
    type="text/css" 
    title="kein Stil" 
    media="screen" 
    alternate="yes"
  </xsl:processing-instruction>
</xsl:template>

Das erzeugt in der angegebenen Reihenfolge drei Verarbeitungsanweisungen im Wurzelknoten, also entsprechend nach der XML-Deklaration. Aufgrund der gemachten Angaben kann der Nutzer von Geräten mit Bildschirmausgabe damit unter drei CSS-Stilvorlagen auswählen.


Erzeugung eines Kommentars, comment[Bearbeiten]

Mit dem Element wird ein Kommentar erzeugt.

Inhaltsmodell: %Vorlage

%Vorlage ist dabei der Kommentartext und unterliegt damit auf die Ausgabe bezogen den Einschränkungen für die Syntax von Kommentarinhalten in XML, insbesondere darf der Inhalt nicht die Zeichenkette '--' enthalten oder auf '-' enden, weil ja der Prozessor bereits das einleitende '<--' und das endende '-->' selbst in der Ausgabe erzeugt.

Beispiel zur Erzeugung eines Kommentars[Bearbeiten]

<xsl:template match="/*/nichtDirektDarzustellen">
<xsl:comment><xsl:value-of select="." /></xsl:comment>
</xsl:template>

Der Inhalt von /*/nichtDirektDarzustellen wird also nur als Kommentar ausgegeben, sofern ansonsten eine Präsentation mit einer Stilvorlage erfolgt, wird dieser Inhalt als nicht präsentiert, ist aber gleichwohl noch als Kommentar im Quelltext zugänglich.

Dies liefert ein anderes Ergebnis:

<xsl:template match="/*/nichtDirektDarzustellen">
<!-- <xsl:value-of select="." /> -->
</xsl:template>

Es kommentiert nur das darin befindliche XSLT-Element aus, es wird also nicht der Inhalt von /*/nichtDirektDarzustellen in die Ausgabe geschrieben und auch kein Kommentar.


Kopieren eines Knotens, copy[Bearbeiten]

Will man Strukturen von der Eingabe direkt in die Ausgabe übernehmen, kann dies einfach mit einer Kopie geschehen.

Inhaltsmodell: %Vorlage

Dabei muß %Vorlage in der Ausgabe wieder dem entsprechen, was dort als möglicher Inhalt zur Kopie hinzugefügt werden darf.

Attribut use-attribute-sets[Bearbeiten]

Das Attribut wird nur berücksichtigt, wenn der zu kopierende Knoten ein Elementknoten ist. Mit dem Attribut können zum Element Attributsätze hinzugefügt werden, welche per attribute-set definiert sind. Der Wert ist eine mit Leerzeichen separierte Liste von Namen die bei attribute-set jeweils mit dem Attribut name angegeben sind.

Beispiele zum Kopieren[Bearbeiten]

Manchmal möchte man als ersten Schritt das komplette Eingabe in die Ausgabe übernehmen, das nennt sich Identitätstransformation und läßt sich mit copy wie folgt umsetzen:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Aber man möchte eventuell dann doch noch ein paar Elemente wieder entsorgen:

<!-- Die Elemente 'dummerchen' und 'sinnlos' 
  gleich aussortieren, 
  diese erste leere Regel 
  ist also eine schwarze Liste von Elementen, 
  die man nicht will -->
<xsl:template match="dummerchen|sinnlos" />
<!-- Identität: -->
<xsl:template match="node()|@*" >
   <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
   </xsl:copy>
</xsl:template>
<!-- Elemente 'vielleicht' auch weglassen, 
  wenn sie vom 'typ' 3 sind: -->
<xsl:template match="vielleicht[@typ='3']" >
   <xsl:apply-templates select="*" />
</xsl:template>

Oder man möchte nur die Attributwerte eines bestimmten Attributes ändern:

<!-- Identität: -->
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<!-- Nun den Wert aller Attribute 
   'antwort' auf '42' setzen -->
<xsl:template match="@antwort[parent::property]">
  <xsl:attribute name="antwort">
    <xsl:value-of select="42"/>
  </xsl:attribute>
</xsl:template>

Enthalten Elemente Text, möchte man vermutlich das xml:lang in die Ausgabe übernehmen, weil man die Sprache mit der Transformation kaum automatisch wird ändern können:

<xsl:template name="copy-lang">
 <xsl:for-each select="@xml:lang">
   <xsl:copy/>
 </xsl:for-each>
 <xsl:apply-templates/>
</xsl:template>

Die benannte Regel ist dann nur überall aufzurufen, wo man die Sprachangabe übernehmen möchte:

<xsl:call-template name="copy-lang"/>


Textbehandlung, Behandlung von Werten, value-of[Bearbeiten]

Mit dem Element kann ein Textknoten erzeugt werden, also als Elementinhalt oder auch als Wert eines Attributes. Das Element ist inhaltsleer.

Attribut select[Bearbeiten]

Mit dem erforderlichen Attribut select wird ein Ausdruck angegeben, mit welchem der Wert eines Knotens ausgewählt wird. Ist der selektierte Knoten ein Attribut, so handelt es sich um den Wert des Attributes, handelt es sich um ein Element, so ist es der Textinhalt des Elementes, entsprechend bei einem Textknoten.

Attribut disable-output-escaping[Bearbeiten]

Zeichen in text, die mit der XML-Syntax in Konflikt stehen, können in der Ausgabe durch Entitäten ersetzt werden, um Wohlgeformtheit automatisch sicherzustellen, in der Vorlagenregel sind sie ja ohnehin zu ersetzen, weil XSLT ja selbst ein XML-Format ist.

Mit dem Attribut disable-output-escaping kann man das bei Bedarf einstellen. Möglich sind die Werte 'yes' und 'no'. 'no' bedeutet, daß der Ersatz mit Entitäten in der Ausgabe vorgenommen wird. 'yes' bedeutet, daß diese Ersetzung abgeschaltet wird.

Wird als Ausgabemethode 'text' gewählt, wird das Attribut ignoriert und es werden nie Ersetzungen vorgenommen.

Wird die Ausgabemethode 'xml' oder 'html' gewählt, so gilt als Voreinstellung 'no', also es werden automatisch Entitäten verwendet.

Beispiele zur Textbehandlung[Bearbeiten]

Beispiel (Auszug Eingabe):

<bild>
  <datei>beispiel.svg</datei>
  <abm breite="30em" hoehe="20em"/>
  <titel>Beispielbild</titel>
  <beschreibung>Zufallsrechtecke verschieden groß, 
   verschieden gedreht.</beschreibung>
</bild>

Auszug Stilvorlage:

<xsl:template match="bild">
  <xsl:element name="image">
    <xsl:attribute 
     name="xlink:href" 
     namespace="http://www.w3.org/1999/xlink"
     >svgueb/<xsl:value-of 
     select="./datei"/></xsl:attribute> 
    <xsl:attribute name="width"><xsl:value-of 
     select="./abm/@breite"/></xsl:attribute> 
    <xsl:attribute name="height"><xsl:value-of 
     select="./abm/@hoehe"/></xsl:attribute> 
    <xsl:element name="title"><xsl:value-of 
     select="./titel"/></xsl:element> 
    <xsl:element name="desc"><xsl:value-of 
     select="./beschreibung"/></xsl:element>
  </xsl:element>  
</xsl:template>

Ergebnis sinngemäß so (Namensraumzuordnung kann leicht variieren, Einrückungen wahrscheinlich anders):

<image xmlns:xlink="http://www.w3.org/1999/xlink" 
       xlink:href="svgueb/beispiel.svg" 
       width="30em" 
       height="20em">
  <title>Beispielbild</title>
  <desc>Zufallsrechtecke verschieden groß, 
   verschieden gedreht.</desc>
</image>

Attributwertvorlage[Bearbeiten]

Statt zu kopieren oder mit value-of auszuwählen, hat man auch einen direkteren Zugriff auf einen Wert eines Attributes oder den Inhalt des aktuellen Elementknotens, um dies als Attributwert zu verwenden, dazu gibt man in der Vorlagenregel einfach den Namen des Attributes in geschweiften Klammern an und erzeugt so eine Ausgabe des Wertes eines Attributes. Verschachtelt werden die Ausdrücke mit geschweiften Klammern nicht.

Beispiel (Auszug Eingabe):

<bild>
  <datei>beispiel.svg</datei>
  <abm breite="30em" hoehe="20em"/>
  <titel>Beispielbild</titel>
  <beschreibung>Zufallsrechtecke verschieden groß, 
   verschieden gedreht.</beschreibung>
</bild>

Auszug Stilvorlage:

<xsl:template match="bild">
  <image xlink:href="svgueb/{datei}" 
   width="{abm/@breite}" 
   height="{abm/@hoehe}">
    <title><xsl:value-of 
     select="./titel"/></title>
    <desc><xsl:value-of 
     select="./beschreibung"/></desc>
  </image>
</xsl:template>

Ergebnis (passende Namensraumzuordnung in der sonstigen Vorlage vorausgesetzt):

<image xlink:href="svgueb/beispiel.svg" 
  width="30em" 
  height="20em">
  <title>Beispielbild</title>
  <desc>Zufallsrechtecke verschieden groß, 
   verschieden gedreht.</desc>
</image>

Analog kann man übrigens auch bei der Namenswahl von Elementen oder Attributen vorgehen.

Beispiel (Auszug Eingabe):

<title class="buchtitel">Ankes Weg</title>
<section class="kapitel">
  <title class="kapitelueberschrift">Aufbruch</title>
  <section class="abschnitt">
    <title class="abschnittsueberschrift">Ankes Traum</title>
    <p>... irgendein Inhalt ...</p>
  </section>
  <section class="abschnitt">
    <title class="abschnittsueberschrift">Ankes Entscheidung</title>
    <p>... irgendein Inhalt ...</p>
  </section>
  <section class="abschnitt">
    ...etc...
  </section>
</section>
<section class="kapitel">
  <title class="kapitelueberschrift">Am Wegesrand</title>
    ...etc...
</section>
...etc...

Auszug Stilvorlage:

<xsl:template match="section">
  <xsl:element name="{@class}">
    <xsl:apply-templates /> 
  </xsl:element> 
</xsl:template>
<xsl:template match="title">
  <xsl:element name="{@class}">
    <xsl:value-of select="."/>
  </xsl:element> 
</xsl:template>

Offenbar ist die semantische Aussagekraft der Elementnamen des Ausgangsformates gering. Immerhin kann man sich dort aber ähnlich wie bei XHTML oder SVG mit dem Attribut class helfen, um die Bedeutung der jeweiligen Struktur anzugeben. In der Stilvorlage werden diese Attributwerte konsequent genutzt, um daraus Elementnamen zu erzeugen. Entsprechend reversibel wäre es also möglich, eine Stilvorlage für eine inverse Transformation zu erstellen.

Numerierung, Erzeugung einer Zahl, number[Bearbeiten]

Gelegentlich sollen gleichartige Strukturen in der Ausgabe durchnumeriert werden, auch wenn die Eingabe dies nicht enthalten hat. Solche Zahlen können mit dem Element number eingefügt werden.

Das Element ist inhaltsleer.

Alle Attribute sind optional. Ohne angegebene Attribute ergibt sich eine einfache Listennumerierung.

Attribut value[Bearbeiten]

Mit dem Attribut kann ein Ausdruck angegeben werden, aus welchem die zu erzeugende Zahl generiert wird.

Beispiel:

<xsl:template match="liste">
  <ol>
  <xsl:for-each select="listenpunkt">
    <xsl:sort select="."/>
    <li>
      <xsl:number value="position()" />
      <xsl:value-of select="."/>
    </li>
  </xsl:for-each>
  </ol>
</xsl:template>

Attribut level[Bearbeiten]

Wenn value nicht angegeben ist, kann mittels level angegeben werden, wie gezählt wird. Bedeutung möglicher Werte:

single
Das aktuelle Element und dessen Nachfahren werden einfach durchnumeriert
multiple
Bei jeder Nachfahrenebene werden pro Ebene die Geschwister mit einer Zahl durchnumeriert
any
Alle Elemente werden einfach durchnumeriert

Attribut count[Bearbeiten]

Mit dem Attribut wird ein Muster angegeben, was zur Zählung beiträgt.

Attribut from[Bearbeiten]

Mit dem Attribut wird ein Muster angegeben, womit die Zählung beginnt. Ansonsten fangen die Zählungen bei 1 an. Die Notation entspricht der von format.

Attribut format[Bearbeiten]

Mit dem Attribut wird eine Zeichenkette notiert, die vorgibt, wie die Zahlen formatiert werden sollen.

Der voreingestellte Wert ist '1'. Dies bewirkt eine Numerierung mit Dezimalziffern, also 1 bis 9, dann weiter mit 10 bis 99, dann 100 bis 999 etc. Gibt man stattdessen '01' an, so ergibt sich 01 bis 09, 10 bis 99, 100 bis 999 etc. Gibt man stattdessen '001' an, so ergibt sich 001 bis 999, dann 1000 bis 9999 etc.

Mit einem Zeichen 'A' ergibt sich A bis Z, dann AA bis AZ, BA bis BZ etc.

Mit einem Zeichen 'a' ergibt sich a bis z, dann aa bis az, ba bis bz etc.

Mit einem Zeichen 'i' ergibt sich eine Numerierung mit kleinen römischen Symbolen.

Mit einem Zeichen 'I' ergibt sich eine Numerierung mit großen römischen Symbolen.

Ein anderes Zeichen wird ohne Interpretation übernommen und eine Numerierung nach Voreinstellung und anderen gegebenenfalls angegebenen Zeichen wird angehängt.

Um die Zeichen für verschiedene Nachfahrenebenen zu trennen, kann etwa ein Punkt '.' angegeben werden.

So bekommt man etwa eine Formatangabe wie '1.A.a.i.I'. Auf oberster Ebene wird also mit dezimalen Ziffern gezählt, die ebene drunter gemäß dem Format A, dann a etc.

Attribut lang[Bearbeiten]

Mit dem Attribut wird angegeben, welcher Sprache das Alphabet folgt, mit welchem die alphabetische Zählung vorgenommen wird. Der Wert entspricht dem von xml:lang also etwa 'de' oder 'en'.

Attribut letter-value[Bearbeiten]

Mit dem Attribut kann ausgewählt werden, ob bei alphabetischer Zählung die englische Reihenfolge verwendet wird oder die sprachspezifische gemäß der üblichen Anordnung nach lang. Für die erstere Variante steht der Wert 'alphabetic', der für das letztere 'traditional', für welchen aber natürlich nicht sichergestellt ist, daß eine Implementierung diese auch kennt, die erstere entspricht der Reihenfolge gemäß der Unicode-Zahlen, welche die Zeichen repräsentieren.

Attribute grouping-separator und grouping-size[Bearbeiten]

Mit dem Attribut grouping-separator wird angegeben, mit welchen Zeichen eine Gruppierung von Ziffern bei großen Zahlen erfolgen soll. Mittels grouping-size wird angegeben, wieviele Ziffern gruppiert werden sollen. Der Wert ist also eine ganze Zahl größer als 0, üblich ist 3.

Sofern nicht beide angegeben werden, wird keine Gruppierung vorgenommen.

Verwendet man für den Separator ' ' und für grouping-size, so erhält man eine Darstellung wie: 7 654 321


Wiederholung for-each[Bearbeiten]

Mit dem Element können Kinder eines Knotens der Reihe nach abgearbeitet werden. Mit einem erforderlichen Attribut select wird weiter eingeschränkt, welche Kinder behandelt werden.

Inhaltsmodell: (%Vorlage | sort)*

Sofern sort nicht angegeben ist, werden die zutreffenden Elemente in der Reihe abgearbeitet, wie sie im Quelltext der Eingabe stehen, sonst entscheidet sort über die Reihenfolge.

Attribut select[Bearbeiten]

Mit dem erforderlichen Attribut select wird ein Ausdruck angegeben, mit welchem der Wert eines Knotens ausgewählt wird.


Bedingte Verarbeitung if[Bearbeiten]

Der Inhalt des Elementes wird nur berücksichtigt, wenn die im erforderlichen Attribut test notierte Aussage wahr ist. Alternativ zu berücksichtigender Inhalt ist nicht vorgesehen.

Inhaltsmodell: %Vorlage

Attribut test[Bearbeiten]

Der Wert des Attributes ist eine logische Aussage. Ist der Wert wahr, wird der Inhalt des Elementes bei der Verarbeitung berücksichtigt, sonst nicht.


Bedingte Verarbeitung choose[Bearbeiten]

Das Element ist ein Container für Alternativen zur bedingten Verarbeitung.

Inhaltsmodell: when+ , otherwise?

Es wird die erste zutreffende Bedingung zur Bearbeitung berücksichtigt, die durch die Kindelemente when und otherwise abgefragt werden.


Bedingte Verarbeitung when und otherwise[Bearbeiten]

Mit den Elementen when werden Bedingungen notiert. Die erste zutreffende Bedingung wird berücksichtigt. Optional kann zuletzt ein otherwise notiert werden, dessen Inhalt berücksichtigt wird, falls zuvor keine Bedingung zugetroffen hat. Ist kein otherwise notiert, wird gegebenenfalls nichts berücksichtigt.

when hat ein erforderliches Attribut test, otherwise nicht.

Inhaltsmodell: %Vorlage

Attribut test[Bearbeiten]

Der Wert des Attributes ist eine logische Aussage. Ist der Wert wahr, wird der Inhalt des Elementes bei der Verarbeitung berücksichtigt, sonst nicht. Dies trifft aber nur zu für das erste Geschwisterelement, nicht für folgende.


Sortierung, sort[Bearbeiten]

Das Element kann als Kind von for-each und apply-templates notiert werden, um die Sortierung zu verarbeitender anderer Kinder festzulegen.

Werden mehrere Elemente sort als Geschwister notiert, so ist das erste der primäre Sortierschlüssel, das nächste der zweite etc. Die Elemente sort sollen als erste Kinder notiert werden.

Das Element ist inhaltsleer.

Alle Attribute sind optional.

Attribut select[Bearbeiten]

Mit dem erforderlichen Attribut select wird ein Ausdruck angegeben, mit welchem der Wert eines Knotens ausgewählt wird, dessen Inhalt zu sortieren ist.

Attribut order[Bearbeiten]

Mit dem Attribut wird festgelegt, ob in aufsteigender oder absteigender Reihenfolge sortiert wird. Der Wert 'ascending' steht für aufsteigend, 'descending ' steht für absteigend.

Attribut lang[Bearbeiten]

Mit dem Attribut wird die Sprache für den Sortierschlüssel festgelegt, der Wert entspricht dem von xml:lang.

Attribut data-type[Bearbeiten]

Mit dem Attribut wird der Datentyp für den Sortierschlüssel angegeben. Der Wert 'text' (Vorgabewert) steht dafür, daß gemäß der mit lang angegebenen Sprache lexikographisch korrekt sortiert werden soll. Der Wert 'number' gibt an, daß die Sortierschlüssel zu Zahlen konvertiert werden sollen, wonach sortiert wird. lang wird dann nicht berücksichtigt. Ferner kann der Wert ein qualifizierter Name sein, wofür allerdings kein bestimmtes Verhalten definiert ist.

Attribut case-order[Bearbeiten]

case-order findet Anwendung beim data-type 'text', dabei geht es darum, ob bei der Sortierung große oder kleine Buchstaben zuerst kommen.

Der Wert 'upper-first' steht für Großbuchstaben zuerst, also A a B b etc. Der Wert 'lower-first' steht für Großbuchstaben zuletzt, also a A b B etc.


Kopie, copy-of[Bearbeiten]

Mit dem inhaltsleeren Element kann ein Fragment aus dem Eingabedokument in das Ausgabedokument kopiert werden. Es wird also nicht nur der Textinhalt kopiert, sondern auch Elemente samt Attributen.

Attribut select[Bearbeiten]

Mit dem erforderlichen Attribut select wird ein Ausdruck angegeben, mit welchem der Wert eines Knotens ausgewählt wird, dessen Inhalt zu kopieren ist. Es wird nur kopiert, wenn das zu kopierende Fragment von der XML-Syntax her in die Ausgabe paßt. Sonst wird eine Umwandlung zu Text vorgenommen und nur dieser kopiert.


Parameterübergabe, with-param[Bearbeiten]

Parameter können mit dem Element an eine Vorlage übergeben werden.

Inhaltsmodell: %Vorlage

Die Parameter werden auf die %Vorlage angewendet, welche als Inhalt notiert wird.

Attribut name[Bearbeiten]

Mit dem Attribut wird der Name des Parameters angegeben. Der Name ist folglich derselbe wie jener, der für das zutreffende Element param gewählt wurde.

Attribut select[Bearbeiten]

Mit dem optionalen Attribut select wird ein Ausdruck angegeben, der den Wert des Parameters (neu) für die zutreffende Vorlage festlegt.


Nachricht versenden, message[Bearbeiten]

Das Element versendet eine Nachricht während der Bearbeitung durch den XSLT-Prozessor. Wie dies geschieht, ist vom Prozessor abhängig. Die Nachricht wird nicht in die Ausgabe geschrieben. Der Prozessor könnte Nachrichten etwa in eine besondere zusätzliche Datei schreiben oder aber auch über ein Nachrichtenfenster für solche Ausgaben verfügen.

Inhaltsmodell: %Vorlage

Die %Vorlage entspricht der zu versendenden Nachricht.


Attribut terminate[Bearbeiten]

Mit dem Attribut kann festgelegt werden, ob die Verarbeitung nach Versenden der Nachricht beendet wird oder nicht. Beim voreingestellten Wert 'no' wird nicht beendet, beim alternativ möglichen Wert 'yes' wird die Verarbeitung beendet.


Alternative für Implementierungslücke, fallback[Bearbeiten]

Bei XSLT-Prozessoren, welche eine XSLT-Version komplett interpretieren, bewirkt das Element nichts. Prozessoren können allerdings auch Implementierungslücken aufweisen. Um solchen Programmen eine weitere Chance zu geben, können im Anschluß an ein Element, für welches der Autor den Verdacht einer Implementierungslücke hat, Elemente fallback notiert werden, also bei Bedarf eines oder auch mehrere. Ist kein fallback angegeben, muß die Implementierungslücke mit einer Fehlermeldung offenbart werden.

Inhaltsmodell: %Vorlage

Die %Vorlage dient als Alternative für das zuvor notierte Element im Falle einer Implementierungslücke.


Zusätzliche Funktionen[Bearbeiten]

Zusätzlich zu den Funktionen von XPath bietet XSLT einige weitere Funktionen.

Anderes Dokument, Funktion document(Objekt , Knotensatz? )[Bearbeiten]

Die Funktion erlaubt den Zugriff auf ein anderes XML-Dokument außerhalb des Eingabedokumentes.

Rückgabe ist ein Knotensatz.

Ist 'Objekt' das einzige Argument der Funktion und eine Knotenmenge, so wird diese Knotenmenge als Eingabe verwendet. Mit dem optionalen zweiten Argument 'Knotensatz' kann die Knotenmenge weiter eingeschränkt werden. Das ist dann ein Ausdruck gemäß XPath zur Knotenauswahl.

Ist das erste Argument keine Knotenmenge, wird dies Argument per Aufruf der Funktion string in eine Zeichenkette umgewandelt. Die Zeichenkette wird wie eine URI behandelt. Mit der URI wird dann ein (XML)-Dokument referenziert, welches als Eingabe verwendet wird. Der referenzierte (XML)-Inhalt wird dann als komplette Baumstruktur entsprechend dem Eingabedokument analysiert. So wird es also möglich, Inhalte aus weiteren Dokumenten für die Ausgabe zu nutzen.

Wird an die URI nach einem # ein Fragmentidentifizierer für ein Fragment im referenzierten Dokument angehängt, so wird dieses Fragment statt des gesamten Dokumentes verwendet. Voraussetzung ist hier, daß im referenzierten Dokument ein Attribut identifizierbar ist, welches als Wert einen Fragmentidentifizierer enthält, also etwa xml:id oder welches in der internen Teilmenge der Dokumenttypdefinition entsprechend definiert ist.

Mit dem zweiten Argument 'Knotensatz' kann die Knotenmenge weiter eingeschränkt werden. Das ist dann ein Ausdruck gemäß XPath zur Knotenauswahl.

Aktueller Knoten, Funktion current()[Bearbeiten]

Die Funktion gibt den aktuellen Knoten zurück. Folgende Fragmente bewirken dasselbe:

<xsl:value-of select="current()"/>
<xsl:value-of select="."/>

Bei Prädikaten gibt es hingegen Unterschiede, folgende Fragmente haben also einen unterschiedlichen Effekt:

<xsl:apply-templates select="element[@attribut1=current()/@attribut2]"/>
<xsl:apply-templates select="element[@attribut1=./@attribut2]"/>

Nicht identifizierte Entität, Funktion unparsed-entity-uri(Entitätenname)[Bearbeiten]

Mit der Funktion kann die URI ausgegeben werden, wo eine Entität definiert wird, also das Dokument mit dem Eintrag in die DTD, sofern vorhanden, gibt es die Entität nicht, so bleibt die zurückgegebene Zeichenkette leer. Das Argument ist der Name der Entität.

Fagmentidentifizierer erzeugen, Funktion generate-id(Knotensatz?)[Bearbeiten]

Gemäß der XML-Namensproduktion wird eine Zeichenkette zurückgegeben, welche als Fragmentidentifizierer für den ersten Elementknoten des Argumentes verwendet wird. Wird kein Argument angegeben, so wird der aktuelle Knoten verwendet.

Systemeigenschaften, Funktion system-property(Name)[Bearbeiten]

Mit der Funktion wird ein Objekt erzeugt, in welchem Informationen über den aktuell verwendeten XSLT-Prozessor stehen. Das Argument ist dabei ein qualifizierte Name einer Systemeigenschaft. Gibt es zu dem Namen keine Systemeigenschaft, wird eine leere Zeichenkette zurückgeliefert. Ein Prozessor muß mindestens folgende Namen kennen und dafür ein Objekt erzeugen:

xsl:version
Eine Zahl, welche angibt, welche XSLT-Version interpretiert wird, für XSLT 1.0 ist die Zahl '1.0'
xsl:vendor
Zeichenkette mit Anbieterkennzeichnung für den XSLT-Prozessor
xsl:vendor-url
Zeichenkette mit URI zum Projektseite des XSLT-Prozessor beziehungsweise des Anbieters


Verfügbarkeit von Elementen, Funktion element-available(Name)[Bearbeiten]

Prozessoren könnten auch Implementierungslücken aufweisen. Die Funktion bietet die Möglichkeit abzufragen, ob XSLT-Elemente oder Elemente aus einem Erweiterungsnamensraum wirklich verfügbar sind. Dazu wird der Funktion der qualifizierte Name des abzufragenden Elementes übergeben. Rückgabe ist der logische Wert für wahr (true), wenn das Element verfügbar ist, sonst der logische Wert für falsch (false).

Da die Interpretation von Elementen aus Erweiterungen natürlich nicht notwendig ist, ist es bei deren Verwendung notwendig, mit fallback oder dieser Funktion sicherzustellen, dass immer eine funktionierende Alternative verfügbar ist.

Mögliche Implementierungslücken zu berücksichtigen, ist eher sinnvoll, wenn bekannt ist, dass einige weiter verbreitete Prozessoren bestimmte Lücken aufweisen, so dass es sich lohnt, diese zu umgehen.


Verfügbarkeit von Funktionen, Funktion function-available(Name)[Bearbeiten]

Aufgrund von Implementierunslücken müssen natürlich auch nicht alle Funktionen verfügbar sein, analog zur Funktion element-available kann mit der Funktion function-available entsprechend abgefragt werden, ob eine Funktion verfügbar ist. Als Argument übergeben wird der Name der Funktion. Rückgabe ist der logische Wert für wahr (true), wenn die Funktion verfügbar ist, sonst der logische Wert für falsch (false).

Namen von XSLT- und XPath-Funktionen werden ohne Namensraumzuordnung notiert. Gehört die Funktion zu einem Erweiterungsnamensraum, wird ein qualifizierter Namen notiert, also dem Namen der Funktion ein Präfix für den Namensraum vorangestellt.