xsl:key

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Das Toplevel-Element xsl:key deklariert einen Schlüssel für dessen nachfolgende Referenz innerhalb von XPath-Pattern und -Ausdrücken über die XSLT-Funktion key().

Klassifizierung Deklaration
Funktionsgruppe Indizieren in Quelldokumenten
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:key zählt zu den Toplevel-Elementen, steht also als unmittelbares Child-Element von xsl:stylesheet oder xsl:transform. Es dürfen beliebig viele Schlüsseldeklarationen erfolgen.

Das Element kann seit XSLT 2.0 einen optionalen Sequenzkonstruktor enthalten, der alternativ zum optionalen use-Attribut die Schlüsselwerte der durch das match-Attribut bezeichneten Knoten erzeugt. In XSLT 1.0 dagegen ist das Element stets leer.

Attribute:

Für die Deklaration xsl:key gelten die Standardattribute. Darüberhinaus besitzt das Element zwei obligatorische Attribute match und name, die den Schlüsselnamen und den dazugehörigen Schlüssel definieren. Zwei weitere Attribute, collation (neu in XSLT 2.0) und use sind optional. Das use-Attribut wird alternativ zum Sequenzkonstruktor im Elementinneren eingesetzt. In XSLT 1.0 ist use dagegen obligatorisch, da hier kein Elementinhalt möglich ist.

collation

Wert

uri-String

Verwendung

Optional

Einführung

XSLT 2.0

Das collation-Attribut bezeichnet eine Datei, die Regeln für Stringvergleiche festlegt, sofern dies erforderlich ist, um Schlüsselwerte korrekt zu vergleichen. Ist keine Collation angegeben, wird die Standardcollation verwendet.

Hinweis: Im Gegensatz zu den sonstigen Gepflogenheiten für das collation-Attribut darf, da xsl:key eine Deklaration darstellt, kein Attributwert-Template verwendet werden. Setzt sich ein Gesamtschlüssel aus mehreren (beispielsweise mit verschiedenen Modulen importierten) Schlüsseldeklarationen gleichen Namens zusammen, so müssen diese alle die gleiche Collation verwenden. Ein Verstoß hiergegen ist ein statischer Fehler (ERR XTSE1220).

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

match

Wert

xpath-pattern

Verwendung

Obligatorisch

Einführung

XSLT 1.0

Als Wert für das match-Attribut dient ein XPath-Pattern, das eine Nodesequenz mit zu indizierenden Knoten definiert. Während der Indizierung werden alle Knoten eingelesen, auf die das match-Attribut passt. Sie bilden den Katalog, der dem Schlüssel zugrunde liegt.

name

Wert

QName

Verwendung

Obligatorisch

Einführung

XSLT 1.0

Das name-Attribut muss einen QName enthalten, der also ein Namespace-Präfix besitzen darf. Der Name dient als Bezeichner des Schlüssels bei dessen Referenzierung.

use

Wert

xpath-expression

Verwendung

Optional (in XSLT 1.0 noch obligatorisch)

Einführung

XSLT 1.0 (geändert in XSLT 2.0)

Das use-Attribut enthält einen XPath-Ausdruck, das für jeden Knoten des Quelldokuments in Folge ausgewertet wird, auf den der match-Ausdruck passt. Das Ergebnis dieses Ausdrucks kann eine Sequenz sein (in XSLT 1.0 ist es ein Nodeset) oder ein String. Im letzteren, einfacheren Fall dient dieser String als Schlüsselwert.

Ist das Ergebnis des use-Ausdruckes eine Sequenz (beispielsweise, weil er mehrere Child-Elemente des Katalogknotens gleichzeitig erfasst), so lie­fert jedes Item der Sequenz einen Schlüsselwert in Form seines Stringwerts (Atomisierung). Der Katalogknoten erhält dann mehrere Schlüsselwerte zugeordnet (man spricht von einem multi-valued key).

Hinweis: Das use-Attribut darf nur alternativ zu einem Sequenzkonstruktor im Elementinneren von xsl:key eingesetzt werden. Es ist also obligatorisch, wenn das Element leer ist und muss entfallen, wenn ein Sequenzkonstruktor vorliegt. Ein Verstoß gegen diese Regel gilt als statischer Fehler (ERR XTSE1205).

Verwendungszweck:

Die Deklaration xsl:key wird benötigt, um einen Schlüssel zu definieren, wobei das name-Attribut den Bezeichner des Schlüssels festlegt.

Unter einem Schlüssel (key) versteht man eine Art von Katalogliste von Knoten des Quelldokuments (meist wird es sich um Elemente handeln) und diesen zugeordneten Schlüsselwerten. Diese Katalogliste wird durch den XSLT-Prozes­sor im Vorfeld beim Einlesen der Dokumente erstellt und kann innerhalb von XPath-Ausdrücken und -Pattern innerhalb des Stylesheets durch die key()-Funktion verwendet werden.

Die XSLT-Funktion key() verwendet dafür zwei Argumente, den Schlüsselna­men und den Schlüsselwert. Beide können als Gesamtheit, also als key-value-Paar, betrachtet werden. Das Auffinden von dergestalt indizierten Knoten ist vor allem bei komplexen XML-Dokumenten wesentlich weniger zeitaufwändig als das – alternativ mögliche – Aufsuchen der entsprechenden Knoten zur Lauf­zeit durch einen XPath-Ausdruck.

Ein Schlüssel muss im Gegensatz zu einem Identifier nicht einzigartig sein. Es darf sowohl ein Schlüssel auf mehrere Knoten verweisen als auch ein Knoten mehrere, auf ihn verweisende Schlüssel zugeordnet bekommen.

Keine Konflikte bei importierten oder inkludierten xsl:key-Deklarationen
Treten durch Import oder Inklusion von Stylesheetmodulen gleich benannte Schlüsseldeklarationen auf, so werden deren Schlüsselwerte addiert. Eine Importpräferenz gilt in diesem Falle nicht (siehe xsl:import und xsl:include).

Deklaration und Aufruf eines Schlüssels:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:key name="angestellte" match="mitarbeiter" use="@abteilung"/>
  <xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="key('angestellte', 'verkauf')">
          <p><b>Name: </b><xsl:value-of select="name"/>
            <br/>
            <b>Geb.: </b><xsl:value-of select="geb"/>
            <br/>
            <b>Gehalt: </b><xsl:value-of select="gehalt"/>
            <br/>
            <b>Fon: </b><xsl:value-of select="fon"/>
            <hr/>
          </p>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Es wird unter dem Bezeichner "angestellte" eine Schlüsseltabelle aller Mit­arbeiter in Bezug auf die Zugehörigkeit zu einer Abteilung gebildet und abge­speichert. Für die Referenzierung wird der Funktion key() der Name des Schlüssels und der zu prüfende Schlüsselwert übergeben – hier der Abtei­lungsname aus dem Attribut abteilung. Erzeugt wird eine Nodesequenz aus allen Mitarbeiterelementen, deren Abteilungsattribut den geforderten Wert besitzt.

Elementdefinition:

XSLT 1.0:

<!-- Category: top-level-element -->
<xsl:key 
     name = qname 
     match = pattern 
     use = expression 
/>

XSLT 2.0:

<!-- Category: declaration -->
<xsl:key
     name = qname
     match = pattern
     use? = expression
     as? = qname
     collation? = uri-string >

<!-- Content: sequence-constructor -->
</xsl:key>

Hinweis: Das use-Attribut ist in der XSLT 2.0-Signatur optional!

   

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

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" 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.


Galileo Press, Rheinwerkallee 4, 53227 Bonn