Keys – Listen von Schlüsseln zur Laufzeit

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

Die Instruktion xsl:key im Zusammenspiel mit der Funktion key() ermöglicht es, XML-Dokumente nach bestimmten Kriterien gewissermaßen zu katalogisie­ren und nach Wunsch ID-IDREF-ähnliche Beziehungen zwischen ihnen auszu­drücken. Genau wie die Verwendung der id()-Funktion beschleunigt das Tan­dem aus xsl:key und key() die Auffindung der katalogisierten Nodes. Es ist dem Prozessor freigestellt, auf welche Weise (sortieren, indizieren o. Ä.) er sich dem Zugriff auf das Key-Verzeichnis erleichtert.

Deklaration von Schlüsseln – xsl:key

Das Element xsl:key wird verwendet, um einen Schlüssel zu deklarieren, wobei das Attribut name den Bezeichner des Schlüssels festlegt. Der Bezeichner muss ein QName sein, kann also ein Namespace-Präfix besitzen.

Unter einem Schlüssel versteht man eine Art von Katalogliste, in der Knoten des Dokuments (meist wird es sich um Elemente handeln) und diesen zugeord­nete Schlüsselwerte gespeichert sind.

Ein Vergleich mit einem assoziativen Array mag in der Sache nicht ganz kor­rekt, aber immerhin anschaulich sein. Ein Key besteht quasi aus drei Teilen:

  • Der Bezeichner:
    Der Bezeichner des Schlüssels – das name-Attribut von xsl:key definiert ihn, die Funktion key() benutzt ihn, um die Liste aufzu­rufen.
    Array: Die Entsprechung wäre der Array-Name.
  • Di Zeiger:
    Eine Liste von Zeigern, die auf alle Knoten aus der match-Nodeset-Liste zeigt. Jedem Schlüsselwert aus der Liste von Schlüsselwerten ist genau ein Zeiger zugeordnet. Je nach Beschaffenheit des Ergebnisses der use-Expression können auf einen Knoten aber mehrere Zeiger der Liste zei­gen.
    Bei Arrays wäre dies der genutzte Inhalt, der »Fächer« des Arrays.
  • Die Schlüsselwerte:
    Eine Liste von Schlüsselwerten, die sich aus der Anwendung der use-Expression über die Sequenz aus dem match-Pattern ergibt. Der Prozessor speichert und optimiert diese Liste (z.B. durch Sortie­rung). Diese Werte und die ihnen zugeordneten Zeiger ergeben die Funktio­nalität von xsl:key und key(). Über den Schlüsselwert wird die Liste von außen angesprochen. Der Schlüs­selwert entspricht also dem »Fachnamen« des Arrays, das auf Anfrage den entsprechenden Inhalt – den gewünschten Zeiger – zurückgibt.

Hinweis: Es ist ebenso wenig ein Fehler, wenn Zeiger aus mehreren (unab­hängigen) Key-Listen auf ein und denselben Knoten gerichtet sind.

Zugriff auf den Schlüssel – die Funktion key()

Die Funktion key() findet Nodes, deren benannter Schlüssel einen bestimm­ten, beim Funktionsaufruf übergebenen Wert besitzt. Die Funktion nimmt also zwei Argumente entgegen – den Bezeichner der zu untersuchenden Indexta­belle (Schlüsselname) und das Kriterium, das die gesuchte Knotenmenge erfül­len muss (Schlüsselwert):

key('schlüsselname','schlüsselwert')

Mittels xsl:key muss ein in Relation zu einem (über das match-Attribut bezeichneten) Element stehender Knoten als Schlüssel deklariert worden sein, erst dann kann key() darauf angewendet werden. Die Relation zwischen dem Element und dessen Schlüsselwert wird durch das use-Attribut ausgedrückt. Die Funktion vergleicht dann alle katalogisierten Werte mit der Vorgabe.

Folgende Deklaration eines Schlüssels wird vorgenommen (hier wird das Attri­but isbn für alle Elemente <buch> zum Schlüssel deklariert und isbn-nummer zum Bezeichner für den Schlüsselaufruf gemacht):

<xsl:key name="isbn-nummer" match="buch" use="@isbn" />

Wird ein umfangreiches Dokument verarbeitet, in dem ein entsprechendes Ele­ment enthalten ist:

<buch isbn="3-899-77610-5"> ... </buch>

so können Sie dieses Buch mittels der key()-Funktion mit folgendem Aus­druck finden:

key('isbn-nummer', '3-899-77610-5')

Dies ist ein unter Umständen effizienterer Weg, ein Element zu finden, als die Methode:

//buch[@isbn='3-899-77610-5']

Vergleichbar ist dies mit dem Indizieren einer Tabelle einer Datenbank, was eine bestimmte Abfrage wesentlich performanter machen kann.

Die Funktion key() kann ihre Stärken dort ausspielen, wo größere Mengen von Elementen zu untersuchen sind. Der XSLT-Prozessor legt einen Index der durch die xsl:key-Deklaration bezeichneten Elemente an, auf den entspre­chend zügig zugegriffen werden kann.

Das gleiche Suchergebnis ist zwar ebenso mittels eines XPath-Predicates zu erzielen, dies aber langsamer. Der Parser müsste alle in Frage kommenden Ele­mente erst nach dem Predicatekriterium prüfen, wohingegen er so dank der Key-Deklaration nur den entsprechenden Zeiger aus der Indexliste zu holen braucht.

Beispiel

Nehmen wir an, ein XML-Dokument enthält ein Glossar von Definitionen <definition> in der Form

<definition term="der_term">
  ... Beschreibung von der_term ...
</definition>

und im Text Markierungen von Ausdrücken der Form <referenz>, die sich namentlich auf die Definitionen der Ausdrücke beziehen sollen:

... <referenz>der_term</referenz> ...

Das folgende Stylesheet generiert Links zwischen den Referenzen und den Definitionen:

<!-- eine Biblithek aller Definitionen bilden: -->
<xsl:key name="ref" match="definition" use="@term"/>
<!-- Link zur Definition in Fließtext einbauen: -->
<xsl:template match="referenz">
  <b>
    <!-- die Definition mit key() suchen: -->
    <a href="#{generate-id(key('ref',.))}"><xsl:apply-templates/></a>
  </b>
</xsl:template>
<xsl:template match="definition">
  <p id="{generate-id()}"><b>Definition: </b><xsl:apply-templates/></p>
</xsl:template>

Der Aufruf von key() innerhalb von generate-id() gibt genau dasjenige mit dem gerade aktuellen Element <referenz> über den Schlüssel ref verbundene Element definition zurück (der Stringwert des Current Nodes <referenz> dient als Vergleichswert der Schüssel) – auf dieses wird dann generate-id() angewendet. Beim zweiten Aufruf von generate-id() wird der gleiche Wert zurückgegeben und dient so als Linkreferenz.

   

<< 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