XSL: Das erste XSL

..index:: XSL: for-each

Lernziel

Sie lernen einfache Möglichkeiten kennen, aus XML durch XSL HTML zu erstellen.

Handlungsanweisungen

Aufgaben
  1. Geben Sie alle Titel Ihrer CD-Datenbank untereinander aus.

  2. Geben Sie zusammen mit den Titeln auch die Interpreten in einer Tabelle aus.

  3. Fügen Sie der Tabelle nun noch eine Spalte Bandinformation hinzu. Stellen Sie den entsprechenden Inhalt dar.

Transformation

Bis jetzt hatten wir uns nur mit der Definition und nicht mit der Ausgabe von XML-Dokumenten beschäftigt. Die Ausgabe der Inhalte können wir durch XSL realisieren. Zur Verdeutlichung des Transformationsprozesse schauen Sie sich bitte die folgende Grafik an.

Transformation-Prozess

XSL erstellen

Das Ziel

Der Vorname und der Nachname sollen in einer HTML-Tabelle dargestellt werden,

wie in folgendem Bild gezeigt:

Ergebnis der Transformation

Schauen wir uns nun das folgende Beispiel an. Beachten Sie bitte die markierte Zeile (Zeilennummer: 2) des XML-Dokumentes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="adressen.xsl"?>
<!DOCTYPE adressensammlung [
     <!ELEMENT adressensammlung (adresse)+>
     <!ELEMENT adresse (anrede, name, strasse, postanschrift, email*)>
     <!ELEMENT anrede (#PCDATA)>
     <!ELEMENT name (nachname, vorname)>
     <!ELEMENT postanschrift (plz, wohnort)>
     <!ELEMENT nachname (#PCDATA)>
     <!ELEMENT vorname (#PCDATA)>
     <!ELEMENT plz (#PCDATA)>
     <!ELEMENT wohnort (#PCDATA)>
     <!ELEMENT strasse (#PCDATA)>
     <!ELEMENT email (#PCDATA)>
]>
<adressensammlung>
<adresse>
  <anrede>Herr</anrede>
    <name>
      <nachname>Zuse</nachname>
      <vorname>Konrad</vorname>
    </name>
    <strasse></strasse>
    <postanschrift>
      <plz></plz>
      <wohnort></wohnort>
    </postanschrift>
</adresse>
<adresse>
  <anrede>Herr</anrede>
    <name>
      <nachname>Leibnitz</nachname>
      <vorname>Gottfried Wilhelm</vorname>
    </name>
    <strasse></strasse>
    <postanschrift>
      <plz></plz>
      <wohnort></wohnort>
    </postanschrift>
</adresse>
</adressensammlung>

In dieser Zeile stellen wir die Verknüpfung zwischen dem aktuellen XML-Dokument und der XSL-Datei her, die in diesem Fall adressen.xsl heißt. Diese XSL ist für die Ausgabe des XML-Inhaltes zuständig. Diese Zeile wird nicht benötigt, wenn Sie an der Kommandozeile und mit dem Tool Saxon arbeiten (siehe Station zur Transformation mit Saxon).

Die Datei adressen.xsl:

Der Inhalt der XSL-Datei sieht wie folgt aus:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>
....
</xsl:stylesheet>
<xsl:output method="html"/>

Mit dem Attribut method (Zeile 4) wird die Ausgabemethode festgelegt, hier HTML-Code. Weitere Möglichkeiten sind text und xml.

<xsl:template match="/">...</xsl:template>

Beginn und Ende einer Template-Definition. Das Attribut match=”/” besagt, dass der Browser bei dem Wurzelelement, dem Element in erster Ebene beginnen soll. match definiert also das Suchkriterium.

<xsl:value-of select="." />

Mit eine XPATH-Ausdruck wird auf den Inhalt eines Elements zugegriffen. So erhalten Sie die Daten der angegebenen Elemente.

Mehrere Datensätze

Wie sieht nun Ihr XSL-Dokument aus, wenn Sie mehrere Adressdaten im XML-Dokument haben? Zunächst das XML-Dokument:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<adressensammlung>
  <!--erster Datensatz-->
  <name>
    <anrede>Herr</anrede>
    <nachname>Zuse</nachname>
    <vorname>Konrad</vorname>
  </name>
  <!-- zweiter Datensatz-->
  <name>
   <anrede>Herr</anrede>
   <nachname>Leibnitz</nachname>
   <vorname>Gottfried Wilhelm </vorname>
  </name>
</adressensammlung>

Mehrere Datensätze – XSL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/">

<h2>Meine Adressen</h2>
<xsl:for-each select="adressensammlung/adresse/name">
  <p>
  <xsl:value-of select="nachname"/>
  <br/>
  <xsl:value-of select="vorname"/>
  </p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Mit dieser Schleifenkonstruktion (gleiches Muster wie in anderen Programmiersprachen) wird mit dem select-Attribut, nach einem Verschachtelungsmuster gesucht. Wenn das Muster passt, wird eine Tabellenzeile in HTML- Syntax erzeugt. Die Pfadangabe folgt den Regeln im Dateisystem, nur das statt der Ordnernamen Elementnamen der XML-Datei verwendet werden.

Eine Tabelle generieren

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/">

<h2>Meine Adressen</h2>

<table border="1">
  <tr bgcolor="#9acd32">
    <th align="left">Name</th>
    <th align="left">Vorname</th>
   </tr>
   <xsl:for-each select="adressensammlung/adresse/name">
     <tr>
        <td>
           <xsl:value-of select="nachname"/>
        </td>
        <td>
           <xsl:value-of select="vorname"/>
        </td>
  </tr>
   </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

Angereichert mit HTML-Konstrukten, sollte die Anzeige im Browser, wie weiter oben gezeigt und geplant aussehen.

Ergebnis der Transformation