generate-id()-Funktion |
Diese Funktion generiert eine eindeutige ID (mit gültigem XML-Namen) für einen bestimmten Knoten. Wird keine Knotenmenge angegeben, erzeugt die Funktion generate-id() eine ID für den Kontextknoten.
Eingaben
Eine optionale Knotenmenge. Wird keine Knotenmenge angegeben, erzeugt diese Funktion eine ID für den Kontextknoten. Ist die Knotenmenge leer, gibt generate-id() einen leeren String zurück.
Ausgabe
Eine eindeutige ID oder ein leerer String, wenn eine leere Knotenmenge angegeben wird. Es ist wichtig, einiges über die Funktion generate-id() zu wissen: Für eine gegebene Transformation muss der XSLT-Prozessor jedes Mal, wenn Sie generate-id() für einen bestimmten Knoten aufrufen, dieselbe ID zurückgeben. Die ID darf sich nicht ändern, während Sie eine Transformation ausführen. Wenn Sie den XSLT-Prozessor morgen anweisen, Ihr Dokument mit diesem Stylesheet zu transformieren, gibt es keine Garantie, dass die Funktion generate-id() noch einmal dieselbe ID erzeugt. Auch morgen werden alle generate-id()-Aufrufe dieselbe ID generieren, doch muss diese ID nicht mit der heute erzeugten übereinstimmen. Die Funktion generate-id() muss nicht prüfen, ob die generierte ID mit einer ID übereinstimmt, die sich bereits im Dokument befindet. Anders ausgedrückt: wenn ein Element im Dokument ein Attribut des Typs ID mit dem Wert sdk3829a besitzt, besteht die vage Möglichkeit, dass eine von generate-id() zurückgegebene ID ebenfalls den Wert sdk3829a hat. Es ist relativ unwahrscheinlich, aber es könnte durchaus passieren. Wenn Sie generate-id() auf zwei verschiedene Knoten anwenden, müssen die beiden erzeugten IDs unterschiedlich sein. Wird der Funktion generate-id() als Argument eine Knotenmenge gegeben, gibt sie eine ID für den Knoten in der Knotenmenge zurück, der in der Dokumentreihenfolge zuerst vorkommt. Wenn die Knotenmenge, die Sie and die Funktion übergeben, leer ist (die Funktion generate-id(fleeber) wird aufgerufen, aber im aktuellen Kontext kommen keine <fleeber>-Elemente vor), gibt generate-id() einen leeren String zurück.
Definition
XSLT-Abschnitt 12.4, Diverse zusätzliche Funktionen
Beispiel
Es folgt ein einfaches Stylesheet, das die Funktion document('') verwendet, um auf alle seine eigenen <xsl:text>-Knoten zuzugreifen. Anschließend wird mit Hilfe der Funktion generate-id() eine eindeutige ID für jeden dieser Knoten generiert. Anschließend wird die Funktion generate-id() erneut aufgerufen, um zu zeigen, dass die Funktion für einen bestimmten Knoten immer dieselbe ID erzeugt. Hier das Stylesheet:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="text"/>

      <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
      </xsl:variable>

      <xsl:template match="/">
        <xsl:value-of select="$newline"/>
        <xsl:text>A test of the generate-id() function:</xsl:text>

        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="document('')//xsl:text">
          <xsl:text>Node name: </xsl:text>
          <xsl:value-of select="name()"/>
          <xsl:text> - generated id: </xsl:text>
          <xsl:value-of select="generate-id()"/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:text>Now we'll try it again...</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="document('')//xsl:text">
          <xsl:text>Node name: </xsl:text>
          <xsl:value-of select="name()"/>
          <xsl:text> - generated id: </xsl:text>
          <xsl:value-of select="generate-id()"/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
      </xsl:template>

    </xsl:stylesheet>
Das Stylesheet erzeugt die folgenden Ergebnisse:
    A test of the generate-id() function:

    Node name: xsl:text - generated id: NC
    Node name: xsl:text - generated id: N16
    Node name: xsl:text - generated id: N22
    Node name: xsl:text - generated id: N28
    Node name: xsl:text - generated id: N38
    Node name: xsl:text - generated id: N44
    Node name: xsl:text - generated id: N4A

    Now we'll try it again...

    Node name: xsl:text - generated id: NC
    Node name: xsl:text - generated id: N16
    Node name: xsl:text - generated id: N22
    Node name: xsl:text - generated id: N28
    Node name: xsl:text - generated id: N38
    Node name: xsl:text - generated id: N44
    Node name: xsl:text - generated id: N4A
Die jeweils erzeugten IDs sind dieselben.