Lösungen zu den Aufgaben aus XSLT und XPath - Runde drei

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 3.)

Die Aufgabenstellungen zu den folgenden Lösungen finden Sie unter Aufgaben.

Aufgabe 1: Benannte Templates

Die Lösung besteht aus einem benannten Template, das über xsl:call-temp­late nach der Zusammenstellung und Verarbeitung der jeweiligen Inhalte des Kapitels aufgerufen wird. Das benannte Template verhält sich völlig statisch und liefert stets den gleichen Output.

<xsl:template match="kapitel">
  <xsl:apply-templates/>
  <xsl:call-template name="kapitelende"/>
</xsl:template>
<xsl:template name="kapitelende">
  <div align="center">*** Ende des Kapitels ***</div>
</xsl:template>

Ausgabeergebnis (Auszug):

… Hier wird dagegen das über den Namen aufgerufene Template direkt in den Prozess hineingezogen (Pull-Verfahren).

*** Ende des Kapitels ***

Code-Beispiel: loesungen/03/a1-artikel.html.

Aufgabe 2: Variablen und Parameter

Der Titel des jeweiligen Kapitels wird ausgelesen und an das benannte Temp­late, das den Trenner schreibt, per Parameter übergeben. Für Notfälle besitzt der Zielparameter einen Defaultwert.

<xsl:template match="kapitel">
  <xsl:apply-templates/>
  <xsl:call-template name="kapitelende">
    <xsl:with-param name="text" select="titel"/>
  </xsl:call-template>
</xsl:template>
<xsl:template name="kapitelende">
  <xsl:param name="text">diesem Kapitel</xsl:param>
  <div align="center">*** Ende von <xsl:value-of select="$text"/> ***</div>
</xsl:template>

Code-Beispiel: loesungen/03/a2-artikel.xsl.

Ausgabeergebnis (Auszug):

… Hier wird dagegen das über den Namen aufgerufene Template direkt in den Prozess hineingezogen (Pull-Verfahren).

*** Ende von Kapitel 1 ***

Code-Beispiel: loesungen/03/a2-artikel.html.

Aufgabe 3: Laufzeitidentifier

Mittels generate-id() wird ein Inhaltsverzeichnis mit Sprunglinks der Aus­gabe eines in XML vorliegenden Artikels vorangestellt.

<xsl:template match="/">
  <html>
    <head>
      <title>XSLT 2.0 und XPath 2.0: generate-id</title>
    </head>
    <body>
      <h1>Inhaltsverzeichnis mit generate-id()</h1>
      <ul>
        <xsl:for-each select="//titel">
          <li>
            <a href="#{generate-id()}">
              <xsl:value-of select="."/>
            </a>
          </li>
        </xsl:for-each>
      </ul>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>
<xsl:template match="kapitel">
  <h3 id="{generate-id(titel)}">
    <xsl:value-of select="titel"/>
  </h3>
  <p>
    <xsl:value-of select="text"/>
  </p>
  <p>
    <a href="#">nach oben</a>
  </p>
  <hr width="60%" noshade="noshade" size="1"/>
</xsl:template>

Code-Beispiel: loesungen/03/a4-generate-id.xsl.

Aufgabe 4: Unparsed Entities

Die Einbindung der in der DTD als »unparsed Entities« deklarierten Grafiken erfolgt im entsprechenden Template mittels der Funktion unparsed-entity-uri(). Um dem Bild die gewünschten Attributwerte zu geben, wird ein deklariertes Attri­butset mit xsl:attribute-set adressiert, und im Literal Result Element <img> über dessen Attribut xsl:use-attribute-sets eingebunden.

Beachten Sie, dass use-attribute-sets in diesem Fall, da es innerhalb eines Literal Result Elements eingesetzt wird, mit Präfix xsl versehen wird, da es im XSLT-Namensraum ist! Dies ist erforderlich, da das Literal Result Element eben nicht im XSLT-Namensraum sein darf.

<xsl:attribute-set name="bild-att">
  <xsl:attribute name="hspace">10</xsl:attribute>
  <xsl:attribute name="vspace">0</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="buch">
  <xsl:apply-templates select="bild"/>
  ...
</xsl:template>
<xsl:template match="bild">
  <img src="{unparsed-entity-uri(@quelle)}" xsl:use-attribute-sets="bild-att"/>
</xsl:template>

Code-Beispiel: loesungen/03/a4-buchdaten.xsl.

Aufgabe 5: Unparsed Entities

Das Template für <buch>-Elemente wird um die Ausgabe eines HTML-<img> erweitert, das mittels einen Attributwert-Templates als Breitenangabe den aus dem Element <verkauf> (Child des Current Node) ausgelesenen Wert erhält.

<xsl:template match="buch">
  <xsl:apply-templates select="bild"/>
  ...
  <p><img src="rot.gif" height="5" width="{verkauf}"/> Verkaufte Exemplare: <xsl:value-of select="verkauf"/></p>
  <hr/>
</xsl:template>

Code-Beispiel: loesungen/03/a4-buchdaten.xsl.

Aufgabe 6: Die XSLT-Funktion document()

Das externe Dokument wird mittels der XSLT-Funktion document() in eine globale Variable gespeichert. Der Inhalt der Variable wird im Buch-Template referenziert und zum aktuellen Buchtitel wird aus dem externen Dokument die passende Kurzkritik herausgesucht und ausgegeben.

<!-- globale Variable für externes Dokument: -->
<xsl:variable name="inhalt" select="document('a6-buchdaten-inhalte.xml')"/>
<!-- hier Elemente "buch" verarbeiten: -->
<xsl:template match="buch">
  <xsl:apply-templates select="bild"/>
  ...
  <!-- hier ist die Inhaltsangabe eingebunden: -->
  <xsl:variable name="der_titel" select="buchtitel"/>
  <p><xsl:apply-templates select="$inhalt//inhalt[@titel=$der_titel]"/></p>
  <!-- hier Breite der Verkaufsgrafik formatieren: -->
  <p><img src="rot.gif" height="5" width="{verkauf}"/>Verkaufte Exemplare: <xsl:value-of select="verkauf"/></p>
  <hr/>
</xsl:template>
<!-- hier Elemente "inhalt" verarbeiten: -->
<xsl:template match="inhalt">
  <p><xsl:value-of select="."/></p>
</xsl:template>

Code-Beispiel: loesungen/03/a4-buchdaten.xsl.

   

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