generate-id

(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: Nodenamen und Identifier

Herkunft: XSLT 1.0

Rückgabewert: Ein String xs:string in der lexikalischen Form eines xs:NCName. Die Funktion ist stabil, gibt also zur Laufzeit für gleichen Input einen konstanten Output zurück.

Aufruf/Argumente:

generate-id($knotensequenz)

$knotensequenz:
Optional. Als Argument kann eine Knotensequenz (XPath 1.0: ein Nodeset) übergeben werden, deren erster Knoten den Identifier erhält. Wird kein Argument übergeben, so wird die Funktion auf den Current Node ange­wendet. Ist das Argument die leere Sequenz oder enthält die Sequenz keine Knoten, so wird der leere String zurückgegeben. Ist das erste Item der übergebenen Sequenz kein Knoten, so wird ein Fehler gemeldet.

Verwendungszweck:

Die Funktion generate-id() dient dazu, einem Knoten (in der Regel einem Element) zur Laufzeit des Stylesheets einen Iden­tifier hinzuzufügen. Dieser Identifier bleibt mit »seinem« Element während der Laufzeit verknüpft – ein erneuter Aufruf der Funktion zur Laufzeit mit demselben Knoten als Argument gibt also den gleichen Identifier-String zurück (die Funktion ist also »stabil« im Sinne der Spezifikation). Gleichzeitig wird gewährleistet, dass für alle Knoten (auch dokumentübergreifend), auf die die Funktion angewen­det wird, ein individueller Identifier verwendet wird.

Der Identifierstring besteht aus beliebigen alphanumerischen ASCII-Zeichen. Er hat die syntaktische Form eines gültigen XML-Bezeichners (xs:NCName), beginnt also mit einem Buchstaben. Darüber hinaus ist die Zusammensetzung des Strings nicht festgelegt, kann also von Parser zu Parser variieren. Es ist dabei ausdrücklich nicht garantiert, dass sich ein generierter ID von bereits statisch im Dokument vergebenen ID-Werten unterscheidet! (Die Wahrscheinlichkeit einer solchen Übereinstimmung ist jedoch ausgesprochen gering.)

Generierte Identifier ermöglichen zur Laufzeit des Stylesheets die zuverlässige Unterscheidung von Knoten. Eine weitere Einsatzmöglichkeit ist die automati­sche Erzeugung von IDREF-Beziehungen bzw. Sprungmarken in einem ausgegebenen XHTML-Dokuments mittels Fragmentidentifiern href="#genID", die auf Elemente mit generiertem id-Attribut id="genID" zeigen (siehe Beispiel).

Es besteht von Seiten des Prozessors keine Notwendigkeit, dass vergebene Identifier für das gleiche Dokument zu jeder Laufzeit des Stylesheets wieder den gleichen Wert erhalten. (Solange das Quelldokument unverändert bleibt, ist dies allerdings meist der Fall, da die Generierung des Bezeichners üblicher­weise auf Grundlage der Position des Knotens im Dokument erfolgt.)

Generierte Identifier nicht über fn:id() ansprechbar
Das Auslesen der mit generate-id() generierten Identifier wäh­rend der Verarbeitung über die fn:id()-Funktion ist nicht möglich. Die generierten Identifier sind sozusagen nur »virtuell« während der Verarbei­tung im Dokumentbaum enthalten, können aber durchaus ausgelesen und ins Ausgabedokument kopiert werden. Die Funktion fn:id() sucht dage­gen nur »real« im XML-Dokument befindliche – und als solche deklarierte – Identifier und benötigt die DTD (oder ein Schema) für deren Verifikation.

Beispiel – Erzeugung von korrespondierenden id-Ankern:

<xsl:template match="lied">
  <!-- id-Ankerpunkt mit generate-id() erzeugen -->
  <h3 id="{generate-id()}"/><xsl:value-of select="titel"/></h3>
  <p><b>Künstler: </b><br/>
    <xsl:for-each select="kuenstler"><xsl:value-of select="."/>
    (auch: <xsl:for-each select="//lied[kuenstler/text()=current()/text()][current()/parent::lied != .]">
             <!-- Link zum id-Anker mit generate-id() erzeugen -->
             <a href="#{generate-id()}"><xsl:value-of select="titel"/></a>
             <xsl:if test="fn:position() != fn:last()"><xsl:text>, </xsl:text></xsl:if>
           </xsl:for-each>)
      <br/>
    </xsl:for-each>
  </p>
  <hr/>
</xsl:template>

Das bei der Erläuterung der Funktion current() vorgestellte Template (siehe dort) wird durch die Erzeugung eines Links aus der Kontextliste der Songs eines Künstlers zum Haupteintrag eines Songs ergänzt. Beim Aufruf des Temp­lates wird an ein <lied>-Element mit generate-id() ein Identifier gebunden. In der inneren xsl:for-each-Schleife wird die Funktion erneut aufgerufen und erzeugt für jedes in der Kontextliste eines Künstlers auftauchende Lied einen Link zum entsprechenden korrespondierenden Haupteintrag.

Es spielt keine Rolle, wann die IDs zu einem Knoten erzeugt werden, d.h., ob dies in diesem Beispiel für den Current Node des Templates geschieht oder im Rahmen der Durcharbeitung der Songs der Kontextliste innerhalb der Schleife. In jedem Fall wird das Ergebnis eindeutig sein – zwischen Erzeugen und Ausle­sen eines generierten IDs besteht also im Grunde kein Unterschied.

Funktionsdefinition:

XPath 1.0:

generate-id(node()?) => String

XPath 2.0:

generate-id(node()?) as xs:string

Mögliche Kompatibilitätsprobleme XPath 2.0 zu XPath 1.0:
Eine mögliche Abweichung des Verhaltens in XPath 2.0 beruht darauf, dass es sich beim ersten Item einer Sequenz nicht um einen Knoten, sondern einen atomaren Wert handeln kann. In die­sem Fall sollte eine Fehlermeldung erfolgen.

Das Verhalten gegenüber reinen Knotensequenzen bzw. leeren Sequenzen ent­spricht dagegen dem Verhalten unter XPath 1.0 gegenüber nicht leeren und leeren Nodesets. Wird eine leerer Nodeset, bzw. in XPath 2.0 eine leere Sequenz, übergeben, so gibt die Funktion jeweils den leeren String zurück.

   

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