Die neuen Fähigkeiten der alten XSLT 1.0-Eigenschaften verstehen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

In XSLT 2.0 gibt es zahlreiche kleine Verbesserungen, und es ist schwierig, sie alle schnell in den Griff zu bekommen.

Lösung

Viele der Fähigkeiten in 2.0 sind Erweiterungen von existierenden 1.0-Anweisungen und -Funktionen. Diese sind nicht so offensichtlich wie diejenigen, die als völlig neue Anweisungen oder Funktionen daherkommen. Dieser Abschnitt bietet eine Übersicht über diese Erweiterungen.

xsl:apply-templates

  • Das Attribut mode kann den Wert #current annehmen, um anzuzeigen, dass die Verarbeitung mit dem aktuellen Modus fortgesetzt werden soll.
  • Sie können die Unterstützung für Sequenzen ausnutzen, indem Sie eine durch Kommas getrennte Liste schreiben (z.B. <xsl:apply-templates select="title, heading, para"/>), wenn Sie zuerst title-Elemente, dann heading-Elemente und schließlich para-Elemente verarbeiten lassen wollen. In 1.0 mussten Sie drei einzelne apply-template-Anweisungen schreiben.

Anmerkung:
Sowohl in 1.0 als auch in 2.0 können Sie schreiben: <xsl:apply-templates select="title | heading | para"/>, allerdings ist dies eine ungeordnete Anwendung. Die Kindknoten werden so verarbeitet, wie sie im Dokument auftauchen, und nicht so, wie Sie sie in der Auswahl anordnen.

<xsl:apply-templates select="title | heading | para"/>

xsl:attribute

  • Ein großes Ärgernis für viele XSLT 1.0-Entwickler war die Unfähigkeit, <xsl:attribute name="foo" select="10"/> zu schreiben, da das select-Attribut nicht unterstützt wurde. Nun wird es unterstützt, und Sie sollten es auch einsetzen, wenn Sie einfache Attribute definieren, obwohl die Syntax zum Konstruieren von Sequenzen weiterhin verfügbar ist.
  • Die Attribute type und validation wurden zur Unterstützung von Schema-fähigen Prozessoren hinzugefügt. type wird verwendet, um native oder benutzerdefinierte Typen anzugeben, die durch W3C Schema definiert sind. validation wird verwendet, um festzulegen, wie das Attribut validiert werden soll.

xsl:call-template

  • Das Ergebnis des Aufrufs kann anstelle einer Knotenmenge eine beliebige Folge sein (wie etwa eine Folge aus Integer-Werten).
  • Sie erhalten eine Fehlermeldung, wenn Sie einen Parameter angeben (über xsl:with-param), den das aufgerufene Template nicht definiert.

xsl:comment

  • Wie bei xsl:attribute wird nun zusätzlich zur Sequenz-Konstruktionsform ein select-Attribut unterstützt.

xsl:copy und xsl:copy-of

  • Es steht ein neues Attribut namens copy-namespaces="yes | no" zur Verfügung, um festzulegen, ob die Namensraumknoten eines Elements kopiert werden sollten. Vorgabe ist yes; das ist auch konsistent zum Verhalten von 1.0.
  • Das Attribut type wurde hinzugefügt, um native oder benutzerdefinierte Typen anzugeben, die durch W3C Schema definiert sind.
  • Das Attribut validation wurde hinzugefügt, um festzulegen, wie das Ergebnis validiert werden soll oder ob bestehende Typanmerkungen beibehalten werden sollen.

xsl:element

  • Die Attribute type und validation wurden zur Unterstützung von Schema-fähigen Prozessoren hinzugefügt. type wird benutzt, um native oder benutzerdefinierte Typen anzugeben, die durch W3C Schema definiert sind. validation wird verwendet, um festzulegen, wie das Element validiert werden soll.

xsl:for-each

  • Kann nun zusätzlich zu Sequenzen aus Knoten beliebige Sequenzen verarbeiten:
<xsl:for-each select="(1, 2, 3, 4, 5)">
  <xsl:value-of select="."/><xsl:text>)&#xa;</xsl:text>
</xsl:for-each>

xsl:key

  • Die Attribute match und use können nun auf globale Variablen verweisen, vorausgesetzt, dass es keine Zirkularität zwischen dem Wert der Variablen und dem Schlüssel gibt:
<xsl:variable name="state" select=" 'active' "/>
<xsl:key name="state-key" match="employee[@state=$state]" use="@type"/>
  • Das Attribut use kann durch den Wert eines Sequenz-Konstruktors ersetzt werden:
<!--Den Wert eines Schlüssels mit Hilfe ausgeklügelter Verarbeitung definieren -->
<xsl:key name="sick-key" select="employee">
  <xsl:apply-templates select="record[@type='sick-day']" mode="sick-key"/>
</xsl:key>
  • Es kann eine Sortierregel angegeben werden, um festzulegen, wann zwei Schlüsselwerte einander entsprechen. Die verfügbaren Sortierregeln hängen von der Implementierung ab.

xsl:message

  • Das Attribut terminate kann nun ein Attributwert-Template sein. Dies vereinfacht globale Veränderungen am Beendigungsverhalten.
  • Zusätzlich zur Sequenz-Konstruktor-Form wird nun ein select-Attribut unterstützt:
<xsl:param name="terminate" select=" 'no' "/>
<xsl:template match="employee">
  <xsl:if test="not(@type)">
    <xsl:message terminate="{$terminate}" select=" 'Missing type attribute for employee' "/>
  <xsl:if>
</xsl:template>

 

xsl:number

  • Es wurde ein select hinzugefügt, um auch das Nummerieren anderer Knoten als des Kontextknotens zu erlauben.
  • Die Formatierungsoptionen wurden verbessert, um die Ausgabe von Wörtern wie »one«, »two«, »three« entsprechend der gewählten Sprache zu erlauben:
<!-- Dies gibt 'Ten' aus -->
<xsl:number value="10" format="Ww"/>

<!-- Dies gibt 'ten' aus -->
<xsl:number value="10" format="w"/>

<!-- Dies gibt 'TEN' aus -->
<xsl:number value="10" format="W"/>

xsl:output

  • Dieser Erweiterung kann ein Name gegeben werden, sodass sie mit der neuen Anweisung xsl:result-document benutzt werden kann. Einzelheiten finden Sie im Rezept String-Literale verarbeiten, die Anführungszeichen enthalten.
  • Eine neue Methode, XHTML, wird unterstützt.
  • Ein neues Attribut, escape-uri-attributes, legt fest, ob URI-Attribute in HTML- und XHTML-Ausgaben geschützt werden müssen.
  • Ein neues Attribut, include-content-type, legt fest, ob ein <meta>-Element zur Ausgabe hinzugefügt werden soll, um den Inhaltstyp und die Kodierung zu kennzeichnen.
  • Ein neues Attribut, normalize-unicode, legt fest, ob Unicode-Zeichen normalisiert werden sollen. Weitere Informationen über Normalisierung finden Sie unter Character Model for the World Wide Web 1.0.
  • Ein neues Attribut, undeclare-namespaces, legt fest, ob Namensräume in XML 1.1 undeklariert sein sollen, wenn sie außerhalb des Geltungsbereichs liegen. Ein Namensraum wird durch xmlns:pre="" undeklariert, wobei pre irgendein Präfix ist.
  • Ein neues Attribut, use-character-maps, erlaubt es Ihnen, eine Liste mit Namen von Zeichenkarten anzugeben (siehe das Rezept Mit Zeichenkarten schwierige Serialisierungsprobleme lösen).

xsl:param

  • Ein as-Attribut kann verwendet werden, um den Typ des Parameters festzulegen.
  • Ein required-Attribut kann verwendet werden, um anzugeben, ob der Parameter zwingend vorgeschrieben oder optional ist.
  • Ein tunnel-Attribut wird verwendet, um anzuzeigen, ob für diesen Parameter die Tunnelung unterstützt wird (siehe das Rezept Objektorientierte Wiederverwendung und Entwurfsmuster emulieren).

xsl:processing-instruction

  • Jetzt wird ein select-Attribut unterstützt.

xsl:strip-space

  • Das Attribut elements kann mit Namenstests der Form *:Name umgehen, die anzeigen, dass aus allen Name-Elementen, ungeachtet des Namensraums, der Whitespace entfernt werden soll (siehe das Rezept Der Umgang mit Whitespace).

xsl:stylesheet

  • Ein neues default-validation-Attribut legt die Standardvalidierung fest, die benutzt werden soll, wenn neue Element- und Attributknoten erzeugt werden und bei der Anweisung, die sie erzeugt, ein validation-Attribut fehlt.
  • Ein neues xpath-default-namespace-Attribut legt den Namensraum fest, der für Elementnamen ohne Präfixe in XPath-Ausdrücken verwendet wird.

xsl:template

  • Es werden über #all oder eine Liste von Modi im Attribut mode mehrere Modi unterstützt.
  • Ein as-Attribut erlaubt es, den Ergebnistyp festzulegen.
  • Das match-Attribut erlaubt die Filterung anhand von Typen.
  • Das match-Attribut kann globale Variablen oder Parameter referenzieren.

xsl:value-of

  • Ein neues separator-Attribut erlaubt das Abtrennen von Sequenzen (siehe das Rezept XML in Daten mit Trennzeichen exportieren).
  • Neben dem select-Attribut wird nun die Sequenz-Konstruktor-Syntax unterstützt.

xsl:variable

  • Ein as-Attribut kann verwendet, werden, um den Typ der Variablen festzulegen.

xsl:with-param

current( )

  • Die Funktion kann zusätzlich zu Knoten verallgemeinerte Objekte (wie etwa einen String) zurückliefern.
  • Kann nun innerhalb eines Filtermusters verwendet werden, um auf das Element zu verweisen, das erfasst wurde.
<!-- Filtert Knoten mit Abkömmlingen, die Attribute besitzen, deren Wert dem lokalen Namen des erfassten Elements entspricht -->
<xsl:template match="*[descendant::*/@* = local-name(current( ))]">

document( )

  • Das erste Argument kann nun eine beliebige Folge von URIs sein.

Anmerkung:
Die neue XPath-Funktion doc( ) ist eine einfachere Alternative zur XSLT-Funktion document( ).

function-available( )

  • Nimmt nun ein zweites Argument entgegen, das die Stelligkeit (Anzahl der Argumente) der getesteten Funktion festlegt.

key( )

  • Ein optionales drittes Argument wird verwendet, um das Dokument anzugeben, das durchsucht werden soll.

Anmerkung:
Dadurch ist es nicht mehr erforderlich, xsl:for-each-Anweisungen festzulegen, deren einziger Zweck darin besteht, auf ein neues Dokument umzuschalten, damit key( ) relativ zu diesem Dokument eingesetzt werden kann:

<!-- Code wie dieser ist nicht mehr notwendig -->
<xsl:for-each select="doc('anderes.xml')">
  <xsl:if test="key('irgendein-schlüssel', $val)">
    <!-- ...-->
  </xsl:if>
</xsl:for-each>

<!-- Schreiben Sie stattdessen -->
<xsl:if test="key('irgendein-schlüssel', $val, doc('anderes.xml'))">
  <!-- ...-->
</xsl:if>

system-property( )

  • Es wird eine xsl:product-Eigenschaft definiert, um den Namen des XSLT-Prozessors zurückzuliefern (z.B. Saxon).
  • Eine xsl:product-version-Eigenschaft wird definiert, um die Version des XSLT-Prozessors zurückzuliefern (z.B. 8.1).
  • Eine xsl:is-schema-aware-Eigenschaft wird definiert, die yes oder no zurückliefert, um anzuzeigen, ob der Prozessor Schema-fähig ist.
  • Eine xsl:supports-serialization-Eigenschaft wird definiert, die yes oder no zurückliefert, um anzuzeigen, ob der Prozessor Serialisierung unterstützt.
  • Eine xsl:supports-backwards-compatibility-Eigenschaft wird definiert, die yes oder no zurückliefert, um anzuzeigen, ob der Prozessor den Abwärtskompatibilitätsmodus (z.B. version="1.0") unterstützt.

Diskussion

Die neuen Fähigkeiten der alten XSLT-Anweisungen werden hauptsächlich durch die Themen Typunterstützung und Konsistenz bestimmt. Konsistenz bedeutet hier vor allem Unterstützung für ein select-Attribut, wenn in der Vergangenheit nur ein Sequenz-Konstruktor unterstützt wurde oder umgekehrt.

Anmerkung:
Ein Tick der Schöpfer von XSLT ist es, dass sie immer wieder zwei unterschiedliche Namen für Konstrukte einführen, bei denen meiner Meinung nach ein Name ausreichend wäre. Denken Sie vor allem an die Attribute as und type. Diese werden niemals zusammen eingesetzt, wieso reicht deshalb nicht einfach type? Ein ähnliches Argument könnte man für die Eliminierung von xsl:with-param zugunsten von xsl:param anbringen, wenn 1.0 angegeben wurde.

  

zum Seitenanfang

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de