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-template 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 Template, 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 Ausgabe 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 Attributset 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>
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