Echte Identifier auslesen mit der Funktion id()

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

Die id()-Funktion wählt Elemente anhand ihres »unique Identifiers« aus, wie sie in einer DTD bzw. in einem Schema mit Typ ID deklariert sind. Der Rückga­bewert der Funktion besteht daher aus einer Nodesequenz aus Elementkno­ten (andere Knotentypen können keine Identifier besitzen). Gesucht wird stets im Dokument, das den Kontextknoten des Aufrufs enthält.

Das Argument der Funktion (ein XPath-Ausdruck) wird als NMTOKENS-Liste interpretiert – jedes der NMTOKEN entspricht einem gesuchten Identifierwert. Letztendlich hat man nach der Auswertung dieses XPath-Ausdrucks daher immer einen String vor sich, der aus einer Aneinanderreihung (nicht Sequenz!) zu prüfender Identifierwerten (candidate ID values) besteht, die durch Leerzei­chen voneinander getrennt sind.

Das Ergebnis des Funktionsaufrufs ist eine Sequenz bestehend aus jenen Ele­mentknoten, die einen (als Typ ID deklarierten) Identifier mit einem der ent­sprechenden gesuchten Werte besitzen. Wird kein entsprechendes Element gefunden, so ist die Ergebnissequenz lediglich leer – es wird kein Fehler gemel­det.

Es gibt zwei Möglichkeiten, wie die Funktion zu ihrer Tokenliste kommt.

Die Auswertung des Arguments ergibt eine Sequenz.
In diesem Fall ergibt sich die Liste aus den Stringwerten aller Knoten der Sequenz. Dies bedeutet nichts anderes, als dass alle unterscheidbaren Worte des Textinhalts der Elementknoten der Sequenz darauf geprüft werden, ob sie als Identifier verwendet werden.

Angenommen, der Stringwert der Sequenz sei »Das ist ein Beispiel«. In die­sem Fall wird nach Identifiern mit den Werten "Das", "ist", "ein" und "Beispiel" gesucht. Resultat ist eine Sequenz, die die Elemente mit den gesuchten Identifierwerten enthält – sofern vorhanden. Diese Art der Suche entspricht ein wenig dem Schuss mit der Schrotflinte.

Das Argument ergibt einen atomaren Wert.
Handelt es sich beim Argument nicht um eine Nodesequenz, so wird es direkt in einen String umgewandelt, der als Tokenliste behandelt wird. Der Rückgabewert der Funktion ist wiederum die Sequenz all derjenigen Elemente, die einen ID besitzen, der einem der Token entspricht.

Zur Verdeutlichung hier ein paar Beispiele:

id("beispiel")

wählt das Element, das einen ID-Wert "beispiel" besitzt. Wo im Dokument sich dieses Element (im Verhältnis zum Current Node) befindet, ist dabei gleichgültig. Da der Rückgabewert der Funktion eine Nodesequenz ist – in die­sem konkreten Fall enthält sie maximal einen Elementknoten –, kann auch unmittelbar ein Pfadausdruck auf ihn angewendet werden:

id("beispiel")/child::abschnitt[position()=4]

wählt das vierte Child-Element <abschnitt> jenes Elements, das den ID mit dem Wert "beispiel" besitzt.

Die id()-Funktion stellt sicher, dass maximal ein Elementknoten zurückgege­ben wird. Sie können anstelle der Funktion id() auch einen Pfadausdruck ein­setzen, der ähnlich, aber nicht identisch wirkt:

//*[@*="beispiel"]/child::abschnitt[position()=4]

Hier werden (erster Schritt) alle Elemente im Dokument gewählt, die ein Attri­but beliebigen Namens mit dem Wert beispiel besitzen. Von den so gefunde­nen Knoten wird (zweiter Schritt) jeweils das vierte Kindelement mit Bezeich­ner abschnitt ausgewählt.

Hauptunterschied ist, dass nicht auf Typ ID geprüft wird – aber auch ein ID-Attribut mit dem gesuchten Wert würde in jedem Fall gefunden. Das Resultat würde jedoch auch die entsprechenden Kindknoten solcher Elemente umfas­sen, die Nicht-ID-Attribute mit dem geforderten Wert besitzen.

   

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