<xsl:attribute> |
Diese Anweisung ermöglicht die Erstellung eines Attributs im Ausgabedokument. Der Vorteil von <xsl:attribute> besteht darin, dass Sie aus Teilen des Eingabedokuments, aus hartkodiertem Text, aus von Funktionen zurückgegebenen Werten und anderen Werten, auf die Sie über das Stylesheet Zugriff haben, den Attributwert erstellen können.
Kategorie
Anweisung
Obligatorische Attribute
name Das Attribut name definiert den Namen des vom Element < xsl:attribute > zu erstellenden Attributs. (Egal, wie man es ausdrückt, über die Attribute des Elements < xsl:attribute > zu reden ist etwas verwirrend, oder?)
Optionale Attribute
namespace Das Attribut namespace definiert den Namensraum-URI, der für dieses Attribut im Ausgabedokument verwendet werden soll. Sie haben keine Kontrolle über das verwendete Namensraum-Präfix, denn mit dem Attribut namespace legen Sie nur den URI des Namensraums fest.
Inhalt
Eine XSLT-Vorlage. Anders ausgedrückt: den Inhalt eines Attributs können Sie mit den Elementen <xsl:choose>, <xsl:text> und <xsl:value-of> erstellen.
Übergeordnetes Element
<xsl:attribute> erscheint innerhalb einer Vorlage.
Definition
XSLT-Abschnitt 7.1.3, Erzeugung von Attributen mit xsl:attribute.
Beispiel
Für dieses Beispiel soll aus dem folgenden XML-Dokument eine HTML-Tabelle erstellt werden:
    <?xml version="1.0"?>
    <list xml:lang="en">
      <title>Albums I've bought recently:</title>
      <listitem>The Sacred Art of Dub</listitem>
      <listitem>Only the Poor Man Feel It</listitem>
      <listitem>Excitable Boy</listitem>
      <listitem xml:lang="sw">Aki Special</listitem>
      <listitem xml:lang="en-gb">Combat Rock</listitem>
      <listitem xml:lang="zu">Talking Timbuktu</listitem>
      <listitem xml:lang="jz">The Birth of the Cool</listitem>
    </list>
Es wird eine Tabelle erstellt, die in einer eigenen Zeile in der rechten Spalte der Tabelle je ein <listitem> aufnimmt und links eine eigene Zelle hat mit rowspan gleich der Anzahl an <listitem>-Elementen im XML-Dokument. Selbstverständlich können wir den Wert für das Attribut rowspan nicht hart kodieren, da sich die Anzahl an Listenelementen (<listitem>) ändern kann. Das folgende Stylesheet verwendet <xsl:attribute>, um die gewünschten Effekte zu erzielen:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="html"/>

      <xsl:template match="/">
        <html>
          <head>
            <title><xsl:value-of select="list/title"/></title>
          </head>
          <body>
            <xsl:apply-templates select="list"/>
          </body>
        </html>
      </xsl:template>

      <xsl:template match="list">
        <table border="1" width="75%">
          <tr>
            <td bgcolor="lightslategray" width="100" align="right">
              <xsl:attribute name="rowspan">
                <xsl:value-of select="count(listitem)"/>
              </xsl:attribute>
              <p style="font-size: 125%">
                <xsl:value-of select="title"/>
              </p>
            </td>
            <td>
              <xsl:value-of select="listitem[1]"/>
            </td>
          </tr>
          <xsl:for-each select="listitem">
            <xsl:if test="position() > 1">
              <tr>
                <td>
                  <xsl:value-of select="."/>
                </td>
              </tr>
            </xsl:if>
          </xsl:for-each>
        </table>
      </xsl:template>

    </xsl:stylesheet>
Hier das generierte HTML-Dokument:
    <html>
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Albums I've bought recently:</title>
    </head>
    <body>
    <table width="75%" border="1">
    <tr>
    <td align="right" width="100" rowspan="7" bgcolor="lightslategray">
    <p style="font-size: 125%">Albums I've bought recently:</p>
    </td><td>The Sacred Art of Dub</td>
    </tr>
    <tr>
    <td>Only the Poor Man Feel It</td>
    </tr>
    <tr>
    <td>Excitable Boy</td>
    </tr>
    <tr>
    <td>Aki Special</td>
    </tr>
    <tr>
    <td>Combat Rock</td>
    </tr>
    <tr>
    <td>Talking Timbuktu</td>
    </tr>
    <tr>
    <td>The Birth of the Cool</td>
    </tr>
    </table>
    </body>
    </html>
Beachten Sie, dass im Element <td> mehrere Attribute hart kodiert sind. Diese Attribute werden mit dem von <xsl:attribute> erzeugten Attribut kombiniert. Es dürfen beliebig viele <xsl:attribute>-Elemente vorkommen, doch müssen sie als Erstes innerhalb des Elements erscheinen, in das Sie Attribute einfügen. In Abbildung A-3 sehen Sie, wie das erzeugte HTML-Dokument aussieht. Dokument mit generierten Attributen Sie sollten sich darüber bewusst sein, dass in diesem Fall auch eine Attribut-Wert-Vorlage hätte verwendet werden können. Den Wert des Attributs rowspan könnten Sie auch wie folgt erzeugen:
    <td bgcolor="lightslategray" rowspan="{count(listitem)}"
      width="100" align="right">
Der Ausdruck in geschweiften Klammern ({}) wird ausgewertet und durch sein Ergebnis ersetzt. In diesem Fall gibt count(listitem) die Nummer 7 zurück. Diese Zahl wird als Wert für das Attribut rowspan verwendet.