key()-Funktion |
Diese Funktion verweist auf eine durch eine <xsl:key>-Anweisung definierte Relation. Konzeptionell gesehen, funktioniert die Funktion key() ähnlich wie die Funktion id(), obwohl Schlüssel flexibler sind als IDs.
Eingaben
Der Name des (durch ein <xsl:key>-Element definierten ) Schlüssels und ein Objekt. Ist das Objekt eine Knotenmenge, wird die Funktion key() auf den String-Wert jedes Knotens in der Knotenmenge angewendet und gibt die Knotenmenge der Ergebnisse aller dieser key()-Funktionsaufrufe zurück. Hat das Objekt einen anderen Typ, wird es in einen String konvertiert, so als wäre die Funktion string() ausgeführt worden.
Ausgabe
Eine Knotenmenge mit den Knoten aus demselben Dokument wie der Kontextknoten, dessen Werte für den angeforderten Schlüssel dem bzw. den Suchargument(en) entsprechen. Anders ausgedrückt: enthält das Stylesheet ein <xsl:key>-Element, das einen Schlüssel mit dem Namen postalcodes definiert, der auf dem <postalcode>-Child aller <address>-Elemente im aktuellen Dokument basiert, so gibt der Funktionsaufruf key(postalcodes, '34829') eine Knotenmenge mit allen <address>-Elementen zurück, die ein <postalcode>-Element enthalten, dessen Wert 34829 ist.
Definition
XSLT-Abschnitt 12.2, Schlüssel
Beispiel
Zur Veranschaulichung der Leistungsfähigkeit der Funktion key() wird das folgende Dokument mit der verkürzten Version eines Glossars verwendet:
    <?xml version="1.0" ?>
    <glossary>
      <glentry>
        <term id="applet">applet</term>
        <defn topic="Java" language="en">
          An application program,
          written in the Java programming language, that can be
          retrieved from a web server and executed by a web browser.
          A reference to an applet appears in the markup for a web
          page, in the same way that a reference to a graphics
          file appears; a browser retrieves an applet in the same
          way that it retrieves a graphics file.
          For security reasons, an applet's access rights are limited
          in two ways: the applet cannot access the filesystem of the
          client upon which it is executing, and the applet's
          communication across the network is limited to the server
          from which it was downloaded.
          Contrast with <xref refid="servlet"/>.
        </defn>

        <defn topic="Java" language="it">
          [Pretend this is an Italian definition of applet.]
        </defn>
        <defn topic="Java" language="es">
          [Pretend this is a Spanish definition of applet.]
        </defn>
      </glentry>

      <glentry>
        <term id="DMZlong" xreftext="demilitarized zone">demilitarized
          zone (DMZ)</term>
        <defn topic="security" language="en">
          In network security, a network that is isolated from, and
          serves as a neutral zone between, a trusted network (for example,
          a private intranet) and an untrusted network (for example, the
          Internet). One or more secure gateways usually control access
          to the DMZ from the trusted or the untrusted network.
        </defn>
        <defn topic="security" language="it">
          [Pretend this is an Italian definition of DMZ.]
        </defn>
        <defn topic="security" language="es">
          [Pretend this is a Spanish definition of DMZ.]
        </defn>
        <defn topic="security" language="jp">
          [Pretend this is a Japanese definition of DMZ.]
        </defn>
        <defn topic="security" language="de">
          [Pretend this is a German definition of DMZ.]
        </defn>
      </glentry>

      <glentry>
        <term id="servlet">servlet</term>
        <defn topic="Java" language="en">
          An application program, written in the Java programming language,
          that is executed on a web server. A reference to a servlet
          appears in the markup for a web page, in the same way that a
          reference to a graphics file appears. The web server executes
          the servlet and sends the results of the execution (if there are
          any) to the web browser. Contrast with <xref refid="applet" />.
        </defn>
        <defn topic="Java" language="es">
          [Pretend this is a Spanish definition of servlet.]
        </defn>
        <defn topic="Java" language="it">
          [Pretend this is an Italian definition of servlet.]
        </defn>

        <defn topic="Java" language="de">
          [Pretend this is a German definition of servlet.]
        </defn>
        <defn topic="Java" language="jp">
          [Pretend this is a Japanese definition of servlet.]
        </defn>
      </glentry>
    </glossary>
Hier das Stylesheet, das zur Verarbeitung dieses Dokuments verwendet wird: Beachten Sie, dass zwei <xsl:key>-Elemente definiert werden, um das XML-Dokument auf zwei Arten zu indizieren:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>

      <xsl:key name="language-index" match="defn" use="@language"/>
      <xsl:key name="term-ids"       match="term" use="@id"/>

      <xsl:param name="targetLanguage"/>

      <xsl:template match="/">
        <xsl:apply-templates select="glossary"/>
      </xsl:template>

      <xsl:template match="glossary">
        <html>
          <head>
            <title>
              <xsl:text>Glossary Listing: </xsl:text>
            </title>
          </head>
          <body>
            <h1>
              <xsl:text>Glossary Listing: </xsl:text>
            </h1>
            <xsl:for-each select="key('language-index', $targetLanguage)">
              <xsl:apply-templates select="ancestor::glentry"/>
            </xsl:for-each>
          </body>
        </html>
      </xsl:template>

      <xsl:template match="glentry">
        <p>
          <b>
            <a>
              <xsl:attribute name="name">
                <xsl:value-of select="term/@id" />
              </xsl:attribute>
            </a>
            <xsl:value-of select="term"/>
            <xsl:text>: </xsl:text>
          </b>
          <xsl:apply-templates select="defn[@language=$targetLanguage]"/>
        </p>
      </xsl:template>

      <xsl:template match="defn">
        <xsl:apply-templates
         select="*|comment()|processing-instruction()|text()"/>
      </xsl:template>

      <xsl:template match="xref">
        <a>
          <xsl:attribute name="href">
            <xsl:text>#</xsl:text><xsl:value-of select="@refid"/>
          </xsl:attribute>
          <xsl:choose>
            <xsl:when test="key('term-ids', @refid)[1]/@xreftext">
              <xsl:value-of select="key('term-ids', @refid)[1]/@xreftext"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="key('term-ids', @refid)[1]"/>
            </xsl:otherwise>
          </xsl:choose>
        </a>
      </xsl:template>

    </xsl:stylesheet>
Eine Transformation des Glossars mit der Zielsprache (targetLanguage) Englisch (en) liefert die folgenden Ergebnisse:
    <html>
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Glossary Listing: </title>
    </head>
    <body>
    <h1>Glossary Listing: </h1>
    <p>
    <b><a name="applet"></a>applet: </b>
          An application program,
          written in the Java programming language, that can be
          retrieved from a web server and executed by a web browser.
          A reference to an applet appears in the markup for a web
          page, in the same way that a reference to a graphics
          file appears; a browser retrieves an applet in the same
          way that it retrieves a graphics file.
          For security reasons, an applet's access rights are limited
          in two ways: the applet cannot access the filesystem of the
          client upon which it is executing, and the applet's
          communication across the network is limited to the server
          from which it was downloaded.
          Contrast with <a href="#servlet">servlet</a>.
        </p>
    <p>
    <b><a name="DMZlong"></a>demilitarized
          zone (DMZ): </b>
          In network security, a network that is isolated from, and
          serves as a neutral zone between, a trusted network (for example,
          a private intranet) and an untrusted network (for example, the
          Internet). One or more secure gateways usually control access
          to the DMZ from the trusted or the untrusted network.
        </p>
    <p>
    <b><a name="servlet"></a>servlet: </b>
          An application program, written in the Java programming language,
          that is executed on a web server. A reference to a servlet
          appears in the markup for a web page, in the same way that a
          reference to a graphics file appears. The web server executes
          the servlet and sends the results of the execution (if there are
          any) to the web browser. Contrast with <a href="#applet">applet</a>.
        </p>
    </body>
    </html>
Abbildung C-5 zeigt, wie dieses Dokument in einem Browser dargestellt wird. Mit der targetLanguage Japanisch (jp) werden die folgenden Ergebnisse erzielt: Generiertes HTML-Glossar
    <html>
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Glossary Listing: </title>
    </head>
    <body>
    <h1>Glossary Listing: </h1>
    <p>
    <b><a name="DMZlong"></a>demilitarized
          zone (DMZ): </b>
          [Pretend this is a Japanese definition of DMZ.]
        </p>
    <p>
    <b><a name="servlet"></a>servlet: </b>
          [Pretend this is a Japanese definition of servlet.]
        </p>
    </body>
    </html>
          </programlisting>
Wie das HTML-Dokument in einem Browser angezeigt wird, sehen Sie in Abbildung C-6. Beachten Sie, dass Sie durch das Ändern der targetLanguage völlig unterschiedliche Ergebnisse erhalten. Generiertes HTML-Glossar