Websiteentwicklung: XSLT: Erste Schritte

Aus Wikibooks

Wechseln zu: Navigation, Suche
Websiteentwicklung XSLTBild:Wikibooks buchseite.svg Erste Schritte


Inhaltsverzeichnis

[Bearbeiten] Einführendes Beispiel

In diesem Kapitel soll es darum gehen, ein kleines einführendes Beispiel zu entwickeln, bei dem die grundsätzliche Idee hinter XSLT deutlich wird. Konkret wird es ein Hallo, Welt!-Beispiel, welches wir in alle möglichen Ausgabedateien transformieren. Lehnen Sie sich zurück und staunen Sie.

Die folgende XML-Datei enthält alles, was wir für unser erstes Beispiel brauchen. Eine kleine Programmdefinition, die ohne Formatierungshinweise auskommt. Ebenfalls benötigen wir keine DTD.

[Bearbeiten] Listing:erstes.xml

<?xml version="1.0"?>
<programm name="MeinErstesProgramm">
  <schreib>Hallo, Welt!</schreib>
</programm>


Ein einfaches Stylesheet, welches obige XML-Datei so bearbeitet, dass daraus ein richtiges Pascal-Programm wird, bietet folgendes Listing:

[Bearbeiten] Listing:nach Pascal

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="ISO-8859-1"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/programm">
  program <xsl:value-of select="@name"/>;
  begin
  <xsl:apply-templates/>
  end.
  </xsl:template>

  <xsl:template match="schreib">
    WriteLn ('<xsl:value-of select="."/>');
  </xsl:template>
</xsl:stylesheet>


Die Ausgabe des XSLT-Prozessors ist wie folgt:

[Bearbeiten] Listing:Ausgabe in Pascal

 program MeinErstesProgramm;
 begin

   WriteLn ('Hallo, Welt!');

 end.

was ein richtiges Pascal-Programm ist. Dieses Programm könnte nun sofort von einem Compiler übersetzt werden um anschließend ausgeführt zu werden.

Dasselbe geht auch mit einer anderen Programmiersprache, hier versuchen wir uns einmal an C:

[Bearbeiten] Listing:nach C

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="ISO-8859-1"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/programm">
  /* Programmname: <xsl:value-of select="@name"/> */
  #include <stdio.h>
  int main (void)
  {
  <xsl:apply-templates/>
    return 0;
  }
  </xsl:template>

  <xsl:template match="schreib">
    printf ("%s\n", "<xsl:value-of select="."/>");
  </xsl:template>

</xsl:stylesheet>

Das Beispiel sieht dem obigen sehr ähnlich, tatsächlich sind nur die C-typischen Zeilen nicht aus obigem Beispiel übernommen.

Lassen wir obige Transformationsvorschriften auf unsere XML-Datei anwenden, so ergibt sich folgende Ausgabe:

[Bearbeiten] Listing:Ausgabe in C

 /* Programmname: MeinErstesProgramm */
 #include <stdio.h>
 int main (void)
 {

   printf ("%s\n", "Hallo, Welt!");

   return 0;
 }

Diese Ausgabe bedeutet wieder ein Programm, diesmal in der Programmiersprache C. Bevor wir aber nun in den Glauben verfallen, wir könnten XML nur in Programmiersprachen transformieren, hier noch schnell ein Beispiel für eine Transformation nach HTML:

[Bearbeiten] Listing:nach HTML

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="html" encoding="ISO-8859-1"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/programm">
  <html><head><title><xsl:value-of select="@name"/></title></head>
  <body>
  <xsl:apply-templates/>
  </body>
  </html>
 </xsl:template>
 <xsl:template match="schreib">
  <p><xsl:value-of select="."/></p>
 </xsl:template>
</xsl:stylesheet>

Die Ausgabe nach der Transformation ist wie folgt:

[Bearbeiten] Listing:Ausgabe in HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MeinErstesProgramm</title>
</head>
<body><p>Hallo, Welt!</p></body>
</html>


Damit haben wir schone eine Menge geschafft. Wie Sie sehen konnten, können wir eine XML-Datei mit Hilfe von XSLT in ein beliebiges Ausgabeformat transformieren. Es ist eine der Stärken von XML, über eine eigene Transformationssprache zu verfügen. Kümmern wir uns nun darum, die obigen Beispiele einmal zu verstehen.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

ist lediglich der Vorspann. Interssanter ist schon die Zeile

<xsl:output method="html" encoding="ISO-8859-1"/>

die deutlich macht, welches Format das Zieldokument hat und welcher Zeichensatz dort benutzt wird. Erlaubte Werte für das Ausgabeformat sind HTML, TEXT und XML. Mit der Anweisung

 <xsl:strip-space elements="*"/>

wird überflüssiger Leerraum zwischen zwei Elementen in der Ausgabe entfernt. die Elemente, für die das gültig ist, können als Liste bei elements angegeben werden. Ein Stern bedeutet alle. die hierzu umgekehrte Anweisung lautet

 <xsl:preserve-space elements="*"/>

und ist voreingestellt bei allen Ausgaben.

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

ist eine so genannte Template Regel (template rule). Der Pfad ist ein XPath. So meint /programm das oberste programm-Element der XML-Datei. Wenn kein solches da ist, dann wende diese Regel nicht an. schreib hingegen meint irgendein Element, das schreib heisst. Egal, wo es steht. Da in unserem kleinen Beispiel programm das erste Element ist, hätten wir den führenden Slash (/) bei der Angabe des Pfades auch weglassen können. andererseits hätten wir auch vollständiger

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

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

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

schreiben können. Das schreib-Element könnten wir in unserem speziellen Beispiel auch zu

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

expandieren. Innerhalb einer jeden Template-Regel wie

 <xsl:template match="PFAD">
   Text
 </xsl:template>

wird Text ausgegeben. Dieser Text wird so wie er da steht übernommen, mit all seinen Leerzeichen und Neue-Zeile-Zeichen. Arbeitsanweisungen wie <xsl:apply-templates/> oder <xsl:value-of select="."/> werden nicht wörtlich ausgegeben, sondern ausgeführt.

<xsl:apply-templates/>

meint hier: Verfolge alle enthaltenen Knoten und wende die Template-Regeln zu den Knoten an. Bei unserer kleinen XML-Datei bedeutet das: Kümmere Dich um den Knoten schreib. Der zwischen <schreib> und </schreib> stehende Text kann mit der Anweisung <xsl:value-of select="."/> ausgegeben werden. In unserem Fall also Hallo, Welt!. Um die Attribute eines Knotens auszugeben, bedienen wir uns des gleichen Befehles:

 <xsl:value-of select="@name"/>

Der Klammeraffe referenziert hier das zu programm gehörende Attribut name und gibt es aus.


[Bearbeiten] Erste Adressdatei

Für die nun folgenden Beispiele dient uns diese Adressdatei als Grundlage:

[Bearbeiten] Listing:Adressdatei

<?xml version="1.0"?>
<adressdatei>
  <adresse>
    <name>Hans Müller</name>
    <strasse>Hansastraße 5</strasse>
    <stadt>44555 Musterstadt</stadt>
  </adresse>
  <adresse>
    <name>Peter Meier</name>
    <strasse>Testallee 23</strasse>
    <stadt>12345 Musterheim</stadt>
  </adresse>
  <adresse>
    <name>Markus Schmidt</name>
    <strasse>Am Mustergäßchen 42</strasse>
    <stadt>00700 Geheimstadt</stadt>
  </adresse>
</adressdatei>


[Bearbeiten] Adressetiketten

Die folgende Transformation dient dazu, Adressetiketten auszugeben, die einzelnen Adressen mit einer Nummer zu versehen und einen Statusbericht über die Summe aller Adressen und behandelten Adressdateien zu generieren.

[Bearbeiten] Listing:nummerierte Adressen

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="ISO-8859-1"/>

  <xsl:template match="/adressdatei">
    Anzahl Adressdateien: <xsl:value-of select="count(/adressdatei)"/> Stück
    Anzahl Adressen: <xsl:value-of select="count(/adressdatei/adresse)"/> Stück
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="adresse">
    <xsl:number/>
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>


Die Ausgabe des XSLT-Prozessors ist wie folgt:

[Bearbeiten] Listing:Ausgabe nummerierter Adressen

    Anzahl Adressdateien: 1 Stück
    Anzahl Adressen: 3 Stück

  1
    Hans Müller
    Hansastraße 5
    44555 Musterstadt

  2
    Peter Meier
    Testallee 23
    12345 Musterheim

  3
    Markus Schmidt
    Am Mustergäßchen 42
    00700 Geheimstadt


Mit <xsl:value-of select="count(/adressdatei/adresse)"/> bestimmen wir die Anzahl der Adressen. Die Funktion count() zählt die Anzahl der ihr übergebenen Knoten. <xsl:number/> gibt die Nummer des aktuellen adresse-Knotens aus, kann aber, wie wir später sehen werden, noch viel mehr.

[Bearbeiten] Rechnung

Eine Rechnungsabteilung würde sich wenig für die konkreten Adressen interessieren, sondern mehr dafür, wieviel Briefe mit aufgeklebten Adressetiketten denn gekostet haben. Solche Rechnungsfälle lassen sich wie folgt abdecken:

[Bearbeiten] Listing:Rechnung

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="ISO-8859-1"/>
  <xsl:template match="/adressdatei">
    Anzahl Adressen: <xsl:value-of select="count(/adressdatei/adresse)"/> Stück
    Kosten:          <xsl:value-of select="count(/adressdatei/adresse) * 0.56"/> Euro
  </xsl:template>
</xsl:stylesheet>

Die Ausgabe der Transformation:

[Bearbeiten] Listing:Ausgabe Rechnung

   Anzahl Adressen: 3 Stück
   Kosten:          1.68 Euro

Mit der Anweisung <xsl:value-of select="count(/adressdatei/adresse) * 0.56"/> lässt sich offensichtlich auch rechnen. Erwarten Sie bitte nicht, dass die letzten Feinheiten statistischer Funktionen so leicht unterstützt werden wie diese einfachen Rechnungen.

[Bearbeiten] Zusammenfassung

Mit XSLT kann man XML-Dokumente in andere Formate umwandeln, wobei Textersetzungen durchgeführt werden können und Angaben über die Art und Position von Knoten gemacht werden kann. Einfache Rechnungen können problemlos durchgeführt werden. Mit XSLT lässt sich ein leistungsstarker Mechanismus aufbauen, die Daten von der eigentlichen Interpretation und Gestaltung zu trennen. Die folgenden Kapitel bieten ihnen einen tieferen Einblick in die Details dieses mächtigen Werkzeuges.



Zurück zu Vorbereitung | Hoch zu XSLT | Vor zu Schleifen
Persönliche Werkzeuge
Buch erstellen
  • Artikel hinzufügen
  • Hilfe zu Sammlungen