XSL: Template Rules

Lernziel

Sie lernen Template Rules kennen und können Templates für bestimmte Elemente definieren.

Handlungsanweisungen

Aufgaben
  1. Geben Sie den gesamten Inhalt der folgenden XML-Datei durch Template Rules in einer HTML-Tabelle aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<adressen_db>
  <adresse nr="1">
    <name>Hubert Taler</name>
    <anschrift>
      <strasse>Weinberg 1</strasse>
      <plz>14777</plz>
      <ort>Berlin</ort>
    </anschrift>
  </adresse>
  <adresse nr="2">
    <name>Uni Potsdam</name>
    <anschrift>
      <strasse>Am Park Babelsberg 3</strasse>
      <plz>14482</plz>
      <ort>Potsdam</ort>
    </anschrift>
  </adresse>
</adressen_db>
Zusatz
  1. Schreiben Sie eine weitere Template-Rule für folgende XML-Datei! Konvertieren Sie die XML nach HTML!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<artikel>
  <ueberschrift>XML als Datenaustauschformat</ueberschrift>
  <autor email="info@meising.org">Stefan Meising
    <bild quelle="meising.jpg"/>
  </autor>
  <abschnitt> Sie haben sicher schon viel über <fett>XML</fett> gelesen?!
    <unterstrichen>Aber:</unterstrichen> Können Sie sich auch  ein Bild
    machen von <br/> den Möglichkeiten des XML-Standards? Was kann XML?
  </abschnitt>
  <abschnitt>
    <fett>
      <kursiv>Eine Übersicht:</kursiv>
    </fett>
    <br/>
    <liste type="sortiert">
      <element>XML ist <rot>nur Text</rot> und kann nichts</element>
      <element>XML ist ein Regelwerk zur Beschreibung von Daten</element>
      <element>XML ist hierachisch aufbebaut</element>
      <element>XML ist von Menschen und Programmen lesbar</element>
    </liste>
  </abschnitt>
</artikel>

Hier noch einige Hinweise für die Entsprechungen der XML-Elemente in HTML:

<h2></h2>    => Überschrift
<p></p>   => Abschnitt
<b></b>  =>  fett
<u></u>  =>  unterstrichen
<i></i>   =>  kursiv
<span style="color:red"></span>   =>  rot
<ul>   =>  Liste
<li>   =>   Element
<br/>   =>   <br/>

Link zur E-Mail:

<a href="mailto:info@meising.org">E-Mail an Meising</a>

Grafik:

<img src="bild.png" />

Template Rules – xml

Sie haben nun schon einige Möglichkieten kennengelernt, XML-Datei durch XSL zu transformieren. Wir zeigen Ihnen nun eine weitere, mit der sie Elemente gezielt ansteuern können. Sie können für jedes Element eigene Regeln (Rules) definieren, um eine Transformation einzuleiten. Schauen Sie sich ein Beispiel an. Sie sehen zunächst die XML-Datei, die aus zwei Datensätzen besteht.

Ziel

Ausgabe von Vor- und Nachnamen in einer Tabelle.

Hier die XML-Datei:

 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
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="adressen.xsl"?>
<adresse>
  <person>
    <anrede>Herr</anrede>
    <name>
      <nachname>Becker</nachname>
      <vorname>Heinz</vorname>
    </name>
    <strasse>Schabenstr. 4</strasse>
    <postanschrift>
      <plz>14489</plz>
      <wohnort>Berlin</wohnort>
    </postanschrift>
    <email>becker@heinz.de</email>
  </person>
  <person>
    <anrede>Frau</anrede>
    <name>
      <nachname>Rennt</nachname>
      <vorname>Lola</vorname>
    </name>
    <strasse>Laufsteig 17</strasse>
    <postanschrift>
      <plz>14888</plz>
      <wohnort>Potsdam</wohnort>
    </postanschrift>
    <email>lolo@lola.de</email>
  </person>
</adresse>

Template Rules – xsl

Schauen Sie sich zunächst die XSL an. Die Erklärungen folgen nach dem Code-Beispiel.

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

  <xsl:template match="adresse">
    <table border="1"><xsl:apply-templates select="person"/></table>
  </xsl:template>

  <xsl:template match="person">
    <tr><xsl:apply-templates select="name"/></tr>
  </xsl:template>

  <xsl:template match="nachname">
    <td><xsl:value-of select="."/></td>
  </xsl:template>

  <xsl:template match="vorname">
    <td><xsl:value-of select="."/></td>
  </xsl:template>

</xsl:stylesheet>

Erklärungen:

<xsl:apply-templates select="person"/>

Dieser Ausdruck ist ein Zeichen für den XSL-Prozessor, nach Template Rules für die Kindelemente (Unterelemente) des gerade bearbeiteten Elementes zu suchen. Die Template Rules sind unten im Quelltext definiert. Der Prozessor findet nun also eine Template Rule für person.

<xsl:template match="person">
<tr>
  <xsl:apply-templates select="name"/>
</tr>
</xsl:template>

Wurde nun person, also ein Datensatz, gefunden, so wird eine Tabellenzeile eröffnet. Innerhalb der beiden tr-Elemente suchen wir nach Template Rules für das Element name. Da name aus zwei Kindelementen besteht, passen die beiden folgenden Template Rules.

<xsl:template match="nachname">
  <td>
    <xsl:value-of select="."/>
  </td>
</xsl:template>
<xsl:template match="vorname">
  <td>
    <xsl:value-of select="."/>
  </td>
</xsl:template>

Die Templates für nachname und vorname passen. Es werden die Spalten mit dem jeweiligen Inhalt ausgegeben. Die beiden Templates können zusammengefasst werden, da sie gleichen Inhalt haben.

<xsl:template match="nachname | vorname">
  <td>
    <xsl:value-of select="."/>
  </td>
</xsl:template>

Die Pipe (|) ist ein Verbindungsoperator. Wenn also nachname oder vorname gefunden werden, so wird die Template angewendet. Das Ergebnis als Bild:

../../_images/ergebnis-template-rules.png