Lösungen zu den Aufgaben aus XSLT und XPath – Runde zwei

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

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

Die folgenden Aufgaben basieren auf der Datei buchhandel.xsl.

Aufgabe 1: Filtern und Sortieren

Wesentlich ist das Filtern der Nodesequenz mit einem Predicate, um die Bücher mit einem Erscheinungsjahr ab 2000 auszufiltern. Die Sortierung erfolgt anschließend.

Der Übersichtlichkeit halber wird das Erscheinungsjahr ebenfalls ausgegeben, und zwar in Zusammenhang mit der Formatierung des Elements <buchverlag>:

<xsl:template match="buchhandel">
  <xsl:apply-templates select="buch[@ersch-jahr &lt; 2000]">
    <xsl:sort select="@ersch-jahr"/>
  </xsl:apply-templates>
</xsl:template>
<xsl:template match="buchverlag">
  <br/><b>Verlag: </b><xsl:apply-templates/>,
  <!-- Ausgabe Erscheinungsjahr -->
  <xsl:value-of select="../@ersch-jahr"/>;
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a1.xsl (Auszug).

Ausgabeergebnis (Auszug):

Unter Korallen und Haien von Hass, Hans;
Verlag: Ozean Verlag, 1950; Preis: 22.95 Euro
(ISBN liegt nicht vor.)

Ganz oben von Hansen, Carl;
Verlag: Berg Verlag, 1960; Preis: 20.95 Euro
(ISBN liegt nicht vor.)

Code-Beispiel: loesungen/02/buchhandel-a1.html.

Aufgabe 2: Filtern und Sortieren

Die Vorgehensweise ist analog zu Aufgabe 1. Das erforderliche Predicate muss mit einer logischen OR-Verknüpfung aus den beiden zu verschmelzenden Bedingungen gebildet werden. Die Resultatmenge entspricht der Vereinigungs­­menge. Bei der Sortierung nach Autoren muss die Zahl der Knoten für das Sor­tierkriterium auf einen begrenzt werden. Dies geschieht mit einem numeri­schen Predicate:

<xsl:template match="buchhandel">
  <xsl:apply-templates select="buch[@ersch-jahr &gt; 1998 or @kat='reisen']">
    <xsl:sort select="buchautor[1]"/>
  </xsl:apply-templates>
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a2.xsl (Auszug).

Ausgabeergebnis (Auszug):

Yet Another Hitchhiker's Guide to the Galaxy von Adams, Douglas;
Verlag: Spacetrotter Publishing, 2001; Preis: 17.00 Dollar
(ISBN: 3-899-77610-5)

Hitchhiker's Guide to the Galaxy von Adams, Douglas;
Verlag: Spacetrotter Publishing, 1997; Preis: 12.00 Dollar
(ISBN: 3-899-77615-4)

Code-Beispiel: loesungen/02/buchhandel-a2.html.

Aufgabe 3a: Filtern, Zählen und Summieren

Kern der Lösung besteht wiederum in einem zusammengesetzten Predicate mit logischer Verknüpfung. Dieses Predicate wird gleichermaßen bei der Zusam­­menstellung der verarbeiteten Knotensequenz als auch bei Zählvorgang, Preis­-Summierung und Durchschnittspreisbildung eingesetzt:

<xsl:template match="buchhandel">
  <p><b>Statistik:</b></p>
  <p>Bücher in der Liste: <xsl:value-of select="fn:count( buch[buchverlag='Berg Verlag' or buchverlag='Ozean Verlag'] )"/></p>
  <p>Gesamtpreis aller Bücher: <xsl:value-of select="format-number(fn:sum(buch[buchverlag='Berg Verlag' or buchverlag='Ozean Verlag']/preis),'##00.00')"/></p>
  <p>Durchschnittspreis aller Bücher: <xsl:value-of select="format-number(fn:sum(buch[buchverlag='Berg Verlag' or buchverlag='Ozean Verlag']/preis) div fn:count(buch[buchverlag='Berg Verlag' or buchverlag='Ozean Verlag']),'##00.00')"/></p>
  <xsl:apply-templates select="buch[buchverlag='Berg Verlag' or buchverlag='Ozean Verlag']"/>
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a3.xsl.

Ausgabeergebnis (Auszug):

Statistik:

Bücher in der Liste: 8
Gesamtpreis aller Bücher: 135.85
Durch­schnittspreis aller Bücher: 16.98

Unter Korallen und Haien von Hass, Hans;
Verlag: Ozean Verlag, 1950; Preis: 22.95 Euro
(ISBN liegt nicht vor.)

Code-Beispiel: loesungen/02/buchhandel-a3.html.

Aufgabe 3b: Filtern und Berechnen

Die Filterung der Bücher nach Währungsangabe »Dollar« erfolgt bei Zusammen­stellung der Nodesequenz. Das Predicate stellt einen Pfadausdruck dar, der vom Current Node zu dessen <preis>-Kindknoten und dessen waehrung-Attri­but zeigt. Die Umrechnung und Formatierung des Werts geschieht bei der Aus­gabe des Preises direkt (es wurde ein Umrechnungsfaktor Dollar/Euro von 0,68054 zu Grunde gelegt).

Bitte beachten Sie, dass der mit Komma angegebene Umrechnungsfaktor im Stylesheet mit Punkt als Dezimal­trenner eingesetzt werden muss!

<xsl:template match="buchhandel">
  <p><b>Statistik:</b></p>
  <!-- Bücher mit Dollarpreis zählen: -->
  <p>Bücher in der Liste: <xsl:value-of select="fn:count(buch[preis/@waehrung='Dollar'])"/></p>
  <!-- Bücher mit Dollarpreis ausgeben: -->
  <xsl:apply-templates select="buch[preis/@waehrung='Dollar']"/>
</xsl:template>
<xsl:template match="preis">
  Preis: <xsl:apply-templates/><xsl:text> </xsl:text><xsl:value-of select="@waehrung"/> 
  entspricht <xsl:value-of select="format-number(. * 0.68054, '##0.00')"/> Euro 
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a3b.xsl.

Ausgabeergebnis (Auszug):

Statistik:

Bücher in der Liste: 5

Where Wizards Stay Up Late von Haf­ner, Katie; Lyon, Matthew;
Verlag: Touchstone, 1996; Preis: 14.00 Dol­lar entspricht 9.52 Euro
(ISBN: 3-899-77609-7)

Yet Ano­ther Hitchhiker's Guide to the Galaxy von Adams, Douglas;
Verlag: Spacetrotter Publishing, 2001; Preis: 17.00 Dollar entspricht 11.56 Euro
(ISBN: 3-899-77610-5)

Code-Beispiel: loesungen/02/buchhandel-a3b.html.

Aufgabe 4: Bedingungen

Sortierung der Nodesequenz erfolgt mit xsl:sort unter Angabe des Titels als Sortierkriterium. Die Vermerke werden mittels xsl:choose eingefügt, wobei zwei Elemente xsl:when mit entsprechenden Bedingungen, aber kein xsl:otherwise eingesetzt wird.

<xsl:template match="buchhandel">
  <p><b>Bücher nach Titel:</b></p>
  <xsl:apply-templates><xsl:sort select="buchtitel"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="buch">
  <p><!-- neu oder vergriffen? -->
    <xsl:choose>
      <xsl:when test="@ersch-jahr &gt; 2003">
        <b>Neu erschienen:</b><br/>
      </xsl:when>
      <xsl:when test="@ersch-jahr &lt; 1975">
        <i>Vergriffen!</i><br/>
      </xsl:when>
    </xsl:choose>
    <!-- jetzt die Buchdaten ausgeben: -->
    <xsl:apply-templates/>
    <!-- liegt ISBN-Nummer vor? -->
    <xsl:choose>
      <xsl:when test="@isbn != ''">
       <br/> (ISBN: <xsl:value-of select="@isbn"/>)
      </xsl:when>
      <xsl:otherwise>
        <br/> (ISBN-Nummer liegt nicht vor.)
      </xsl:otherwise>
    </xsl:choose>
  </p>
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a4.xsl.

Ausgabeergebnis (Auszug):

Bücher nach Titel:

Vergriffen!
Ganz oben von Hansen, Carl;
Verlag: Berg Verlag, 1960; Preis: 20.95 Euro
(ISBN liegt nicht vor.)

Neu erschienen:
Irreguläre Ausdrücke von Esser, Klaus;
Verlag: Java Verlag, 2004; Preis: 27.00 Euro
(ISBN liegt nicht vor.)

Code-Beispiel: loesungen/02/buchhandel-a4.html.

Aufgabe 5: Gruppieren und Nummerieren

Die Gruppierung erfolgt relativ einfach mit xsl:for-each-group, wobei das Erscheinungsjahr als current-grouping-key() und die Titel jeweils als Sequenz current-group() in einer xsl:for-each-Schleife ausgegeben wer­den. Die Nummerierung geschieht indirekt durch eine HTML-<ol>-Liste. Alter­nativ könnte position() hier eingesetzt werden, nicht aber xsl:number (es sei denn mit value-Attribut), da die Buchtitel nicht in Dokumentreihenfolge ausgegeben werden:

<xsl:template match="/">
  <html>
    <head>
      <title>XSLT 2.0 und XPath 2.0: Gruppieren</title>
    </head>
    <body>
      <h1>Bücher nach Erscheinungsjahr gruppiert</h1>
      <!-- Bildung der Gruppen: -->
      <xsl:for-each-group select="buchhandel/buch" group-by="@ersch-jahr">
        <xsl:sort select="@ersch-jahr"/>
        <h3>Erscheinungsjahr: <xsl:value-of select="current-grouping-key()"/></h3>
        <ol>
          <!-- Ausgabe der Einzeltitel: -->
          <xsl:for-each select="current-group()/buchtitel">
            <li>
              <xsl:value-of select="."/>
            </li>
          </xsl:for-each>
        </ol>
      </xsl:for-each-group>
    </body>
  </html>
</xsl:template>

Code-Beispiel: loesungen/02/buchhandel-a5.xsl.

Ausgabeergebnis (Auszug):

Erscheinungsjahr: 2003

1. Java für Theoretiker Bd. 1
2. Reguläre Ausdrücke
3. Java für Theoretiker Bd. 2

Code-Beispiel: loesungen/02/buchhandel-a5.html.

   

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