fn:idref

(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: XPath 2.0

Rückgabewert: Eine Sequenz in Dokumentreihenfolge aus denjenigen Nodes des Kontextdokuments, die einen IDREF- oder IDREFS-Wert besitzen, der einem der übergebenen ID-Werte entspricht.

Aufruf/Argumente:

fn:idref($stringsequenz, $node)

$stringsequenz:
Obligatorisch. Eine Sequenz aus Strings xs:string, von denen jeder einzelne als ID-Wert behandelt wird. Wird der Funktion die leere Sequenz übergeben, so gibt sie eine leere Ausgabesequenz zurück.

$node:
Optional. Mit dem zweiten Argument kann ein beliebiger Knoten übergeben werden, der Teil des Dokument ist, innerhalb dessen die Funktion arbeiten soll. Wird die leere Sequenz übergeben, so bezieht sich die Funktion auf das beim Aufruf aktuelle Kontextdokument (dies entspricht dem Aufruf mit einem einzigen Argument).

Verwendungszweck:

Die Funktion fn:idref() soll auf typgültige Doku­mente angewendet werden. Grundlage für ihren Einsatz ist das Vorhandensein einer DTD (oder eines Schemas), auf die zugegriffen werden kann und in dem der Attribute vom Typ IDREF deklariert sind, die daher ein is-idrefs-Property besitzen.

Die Funktion dient dazu, eine in Dokumentreihenfolge sortierte Sequenz all jener Nodes zu erzeugen, die ein IDREF-Attribut besitzen, dessen Wert einem der Funktion übergebenen ID-Wert gleicht (bzw. ein IDREFS-Attribut, bei dem dies für einen seiner Teilwerte der Fall ist).

Sie arbeitet damit genau entgegengesetzt zur Funktion fn:id() und erlaubt es, ID-Werte zu IDREF- oder IDREFS-Werten, die diese referenzieren, in Beziehung zu setzen.

Die Liste der zu überprüfenden ID-Werte wird aus der übergebenen Stringse­quenz generiert, indem jeder der Strings als ID-Kandidat betrachtet wird. Jeder String muss lexikalisch den Anforderungen an den Typ ID entsprechen (also dem Typ xs:NCName entsprechen), ansonsten wird es verworfen bzw. ignoriert. Treten Doubletten in der Reihe der verbleibenden ID-Werte auf, so wird von ihnen der jeweils erste behalten und die restlichen werden verworfen.

Mit Hilfe der so gebildeten Liste aus Werten wird das Kontextdokument nach Elementen mit Attributen vom Typ IDREF oder IDREFS durchsucht, die einen der ID-Kandidatenwerte enthalten. Wird ein solches Element gefunden, so wird es genau einmal der Ergebnissequenz hinzugefügt. Das heißt, es erscheint auch dann nur einmal in der Ergebnissequenz, wenn es z.B. ein IDREFS-Attribut besitzt, das mehrere Werte der ID-Kandidatenwerte enthält.

Mit Hilfe des optionalen zweiten Funktionsarguments kann ein alternatives Dokument bezeichnet werden, auf das sich die Funktion beziehen soll. Hierzu kann der Dokumentknoten dieses Dokuments oder ein beliebiger anderer Knoten übergeben werden, der Teil des Dokuments ist. Es ist jedoch ein Fehler, wenn ein Knoten übergeben wird, dessen Baum keinen Dokumentknoten als Wurzelelement besitzt (»No context document«,  err:FODC0001).

Wird kein zweites Argument übergeben und existiert zum Zeitpunkt des Funk­tionsaufrufs kein Kontextknoten, so ist das Kontextdokument nicht bestimmbar was einen Laufzeitfehler zur Folge hat (err:XPDY0002). Existiert ein Kontextitem, aber handelt es sich bei ihm nicht, wie gefordert, um einen Knoten, so erfolgt die Typfehlermeldung err:XPTY0004. Dies ist analog zu fn:id().

Die Überprüfung des Dokuments erfolgt in Dokumentreihenfolge, dement­sprechend ist die Ergebnissequenz aus Nodes mit den gesuchten IDREF-Werten ebenfalls in Dokumentreihenfolge sortiert und enthält keine Doubletten.

Die Gleichheit von IDREF- und ID-Kandidatenwert wird anhand der Unicode-Werte (Codepoints) ihrer Zeichen bestimmt. Es wird keine Collation (auch nicht die Default-Collation) hinzugezogen, demzufolge ist unbedingte Identität in Bezug auf die Zeichenwerte erforderlich.

Beispiel – Auflösung einer Beziehung von IDREFS nach ID:

Es werden mit fn:idref() Eingangswerte vom Typ ID verarbeitet und Ele­mente mit dem entsprechenden IDREF- oder IDREFS-Attribut gesucht.

Das Beispiel zur Funktion fn:id() wird umgekehrt:

Die Autoren-Elemente besitzen jeweils ein Attribut vom Typ ID (hier auch mit Bezeichner id), dessen Wert mit einem Token der IDREFS-Liste eines Buchs korrespondiert:

<autor id="autor1">
  <vorname>Bernhard</vorname>
  <nachname>Beispielautor</nachname>
</autor>

Diesmal sind die Bücher zu finden, an denen der Autor beteiligt ist, dessen IDREFS-Attribut den Wert des ID-Attributs des <autor>-Elements als Token enthält. Ein Buch kann mehrere Autoren besitzen, die vom <buch>-Element über ein IDREFS-Attribut autoren referenziert werden.

<buch autoren="autor1 autor2 autor3">Beispieltitel</buch>

Current Node ist ein Element <autor>. Bei der Verarbeitung wird der Wert sei­nes Attributs id als Argument der Funktion fn:idref() verwendet, um alle <buch>-Elemente zu finden, deren jeweilige IDREFS-Attribute den übergebe­nen Wert enthalten:

<xsl:template match="autor">...hat (mit)geschrieben an 
  <xsl:for-each select="fn:idref(@id)">
    <!-- Sequenz aus allen vom Autor geschriebenen Büchern -->
    <xsl:value-of select="titel"/>
    <xsl:if test="position() != last()">, </xsl:if>
    <xsl:if test="position() = last()"> und </xsl:if>
  </xsl:for-each>
</xsl:template>

Als Ergebnis wird die Liste aller Buchtitel ausgegeben, an denen der Autor beteiligt war und von denen aus deshalb eine IDREF-Beziehung zum <autor>-Element besteht.

Funktionsdefinition:

XPath 1.0:

Funktion nicht verfügbar

XPath 2.0:

fn:idref($arg as xs:string*) as node()*

fn:idref($arg as xs:string*, $node as node()) as node()*

   

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