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 | |
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 liefert 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-Prozessor 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üsselnamen 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 Laufzeit 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 Mitarbeiter in Bezug auf die Zugehörigkeit zu einer Abteilung gebildet und abgespeichert. Für die Referenzierung wird der Funktion key() der Name des Schlüssels und der zu prüfende Schlüsselwert übergeben – hier der Abteilungsname 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>
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