key

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

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

   

Kategorie: Assoziation und Auffindung von Nodes und Ressourcen

Herkunft: XSLT 1.0

Rückgabewert: Eine Node-Sequenz, deren Zusammensetzung bestimmt ist durch die übergebene Kombination eines Namens und eines gewünschten Werts einer Schlüsseldefinition

Aufruf/Argumente:

key($schluesselname, $vergleichswerte?, $teilbaumstartknoten?)

$schluesselname:
Obligatorisch. Das erste Argument teilt der Funktion den Bezeichner der Schlüsseldefinition(en) xsl:key mit, auf den sich die Funktion bezieht. Das Argument wird als String interpretiert, der dem QName einer Key-Definition xsl:key entsprechen muss. Gibt es mehrere identisch benannte Key-Deklarationen, so werden sie alle zusammengefasst verwendet. (Der Fall, dass gleichnamige xsl:key-Deklarationen sich etwa auf unterschiedliche Collations beziehen, kann nicht auftreten, da dies einen statischen Fehler verursacht.) Ein mög­licher Unterschied in ihrer Importpräzedenz (siehe xsl:import) spielt keine Rolle. Es ergibt einen Laufzeitfehler, wenn zum Zeitpunkt der Auswertung der Funktion keine Deklaration mit dem entsprechenden QName existiert oder kein gültiger QName übergeben wurde.

$vergleichswerte:
Optional. Das zweite Argument übergibt der Funktion eine Sequenz, aus der die Vergleichswerte abgeleitet werden. Dies geschieht durch Atomisie­rung aller nicht atomaren Items, sodass eine Folge atomarer Werte xs:anyA­tomicType erzeugt wird, die jeweils einzeln als Schlüsselwert herangezogen werden. Der Vergleich findet gemäß des eq-Operators statt, entsprechend der in der xsl:key-Deklaration vereinbarten Collation. Wird als zweites Argument ein leerer String oder eine leere Sequenz übergeben, so ist der Rückgabewert der Funktion ebenfalls leer.

$teilbaumstartknoten
Optional. Ein einzelner Knoten beliebigen Typs (sinnvollerweise ein Elementknoten des verarbeiteten Dokuments). Das dritte Argument kann die Wirkung der Funktion auf einen Teilbaum des Dokumentbaums beschränken. Der übergebene Knoten wird als Startknoten jenes Teilbaums betrachtet, zu dem die betrachteten Knoten im Verhältnis Ancestor-Or-Self stehen. Wird das dritte Argument nicht übergeben, so tritt sein Defaultwert / in Kraft, der den Dokumentknoten des Kontextknotens bezeichnet. In diesem Fall wirkt die Funktion im gesamten verarbeiteten Dokument.

Verwendungszweck:

Die Funktion key() stellt eine Sequenz derjenigen Nodes im verarbeiteten Dokument zusammen, deren assoziierte Schlüsseldefi­nition einem oder mehreren derjenigen Werte gleicht, die sich aus der atomi­sierten beim Funktionsaufruf als zweites Argument übergebenen Sequenz ergibt. Die so erstellte Node-Sequenz ist in Dokumentreihenfolge geordnet und enthält keine Dubletten.

key('schlüsselname', wert-sequenz)

Die Funktion key() kann ihre Stärken dort ausspielen, wo größere Mengen von Elementen zu untersuchen sind. Man kann es sich so vorstellen, dass der Parser bereits beim Einlesen des Dokuments einen Index in Form einer Look-Up-Tabelle der durch die xsl:key-Deklaration bezeichneten Elemente erstellt. Auf diese gespeicherte Tabelle kann entsprechend schnell zugegriffen werden.

Ein analoges Ergebnis wäre zwar ebenso über ein XPath-Predicate zu erzielen, dies aber wesentlich langsamer: Der Parser muss sich alle in Frage kommenden Elemente erst »ansehen«, wogegen er sie dank einer Key-Deklaration bereits »kennt«.

Beispiel – Schleife mit Schlüssel:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="nach-autor" match="buch" use="autor"/>
  <xsl:template match="/">
    <html>
      <body>
        <h3>Titelliste</h3>
        <ul>
          <xsl:for-each select="key('nach-autor', 'Max Muster')">
            <li>
              <xsl:value-of select="titel"/>
            </li>
          </xsl:for-each>
        </ul>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Es wird eine Liste von Buchtiteln eines (hier als String übergebenen) Autors ausgegeben. Die im Quelldokument vorhandenen Buchelemente sind durch eine Schlüsseldefinition xsl:key nach Autoren katalogisiert. Die xsl:for-each-Instruktion bildet eine Schleife über alle Bücher des entsprechenden Autors, wobei die key()-Funktion zur Dereferenzierung des Schlüssels ver­wendet wird. Hierbei werden der Bezeichner des Schlüssels und der Name eines Autors als Argumente übergeben.

Funktionsdefinition:

XSLT 1.0:

key(string, object) -> node-set

XSLT 2.0:

key($key-name as xs:string,
    $key-value as xs:anyAtomicType*) as node()*

key($key-name as xs:string,
    $key-value as xs:anyAtomicType*,
    $top as node()) as node()*

Mögliche Kompatibilitätsprobleme XPath 2.0 zu XPath 1.0:
Keine. XSLT 2.0 bildet zwar kein Ergebnis-Nodeset, sondern eine Ergebnis­sequenz, die aber ebenfalls keine Dopplungen enthaltener Nodes erlaubt und in diesem Sinne äquivalent zu einem Nodeset ist.

   

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