Die Transformation von XML-Dokumenten mit XSLT

Joachim on 30.9.2015

Hier eine kleine Einführung in die Transformation von XML-Dokumenten mit XSLT. Weiterführende Informationen findet Ihr unter -> Links!

Was ist XSLT

XSLT wurde mit dem Ziel entwickelt, XML-Dokumente in andere XML-Dokumente zu transformieren. Aber XSLT vermag vermag mehr als nur dies und so kann man sagen, dass XSLT für die Trasformation von XML-Strukturen in andere Formate eingesetzt werden kann.

XSL-Familie: XSLT, XSL-FO, XPath

XSLT als Sprache ist Teil einer Sprachfamilie, genannt XSL (Exrensible Stylesheet Language). Die Bezeichnung sorgt auch heute noch oft für Verwirrung. XSL ist eine Formatierungssprache und wurde für die Präsentation von XML-Dokumenten auf dem Bildschirm und im Druck vorgesehen. Es stellte sich aber schon bald heraus, dass für diese Aufgabe eigenlich zwei Schritte erforderlich sind:

  1. Eine Transformation der Struktur, in dem Elemente ausgewählt, sortiert, oder  gruppiert werden.
  2. Die eigentliche Formatierung.

Da diese Schritte voneinander unabhängig sind, wurde XSL aufgeteilt und zwar in:

  1. Transformationssprache XSLT
  2. Fromatierungssprache XSL-FO (XSL Formatting Objects))

Bei der Weiterentwicklung von XSLT, haben die Entwickler festgestellt, dass zwischen dem Teil in XSLT, der für die Selektierung von Dokumententeilen, und der XPointer-Sprache (wurde für die Verlinkung zwischen XML-Dokumenten bzw. deren Teilen untereinander entwickelt) viele Übereinstimmungen gibt. Um dieses zu vermeiden wurde eine einheitliche Sprache für die Slektierung ausgearbeitet. Diese Sprache wird als XPath (XML Path Language) bezeichnet. So besteht die XSL-Sprachfamilie aus folgenden Teilen, die auch über eine eigene Spezifikation verfügen:

  • XSL-FO (Extensible Stylesheet Language - Formatting Objects)
  • XSLT (Extensible Stylesheet Language: Transformations)
  • XPath (XML Path Language)

Wie funktioniert XSLT

XSLT-Stytesheets werden selbst in XML geschrieben und basieren auf Struktureinheiten, genannt Templates. Aufgrund der definierten Templates wird der Transformationsprozess durchgeführt. Jedes XSL-Template muss mit einem beginnen. Das Attribut version referenziert die Version der XSL(T) Spezifikation.)

XSLT-Transformation

Der XSL(T)-Prozessor durchläuft eine XML-Datei und versucht übereinstimmungs-Regeln zu finden. Die Inhalte der Elemente können in zwei verschiedenen Arten gewonnen werden:

  1. Das "xsl:value-of" Konstrukt. Hier werden die Inhalte der Elemente ohne weitere Verarbeitung benutzt. Sie ermöglicht eine beliebig komplexe Selektion von Informationen mithilfe von XPath-Ausdrücken. Diese Art wird im allgemeinen als Pull processing bezeichnet.
  2. Die Anweisung "xsl:apply-templates". Der Parser verarbeitet weiterhin alle selektierten Elemente, für die eine Vorlage definiert wurde. Diese Art wird auch als Push processing bezeichnet.

Beispiel: Transformation der XML-Datei buch.xml mithilfe des Stylesheets buch.xsl in die HTML-Datei buch.html

XML-Datei: buch.xml

<?xml version="1.0" encoding="iso-8859-1"?>
<katalog>
	<buch id="nyjo123" sprache="deutsch" seiten="1222" erschienen="ja">
		<titel>Der Herr der Dinge</titel>
		<autor>
			<vorname>Hans</vorname>
			<nachname>Mustermann</nachname>
		</autor>
		<isbn>922-2-218-11828-6</isbn>
		<umfang>Zweifarb., 8 farb. Zwischentitel, 3 Ktn, 3 Lesebändchen, Anh., Reg.</umfang>
		<seiten>1222</seiten>
		<einband>Leinen</einband>
		<preis waehrung="EUR">24,90</preis>
	</buch>
	<buch id="nyjo278" sprache="deutsch" seiten="122" erschienen="ja">
		<titel>Der Herr der anderen Dinge</titel>
		<autor>
			<vorname>Franz</vorname>
			<nachname>Musterhaus</nachname>
		</autor>
		<isbn>922-2-111-11828-6</isbn>
		<umfang>Einfarb., 0 farb. Zwischentitel, 3 Ktn, 3 Lesebändchen, Anh., Reg.</umfang>
		<seiten>122</seiten>
		<einband>Pappe</einband>
		<preis waehrung="EUR">2,90</preis>
	</buch>
</katalog>

XSL-Datei: buch.xsl

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" indent="yes" encoding="iso-8859-1"></xsl:output>
	<xsl:template match="/katalog">
		<html>
			<head>
				<title>
					<xsl:value-of select="buch/titel"></xsl:value-of>
				</title>
			</head>
			<body>
				<xsl:apply-templates></xsl:apply-templates>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="autor">
		<tr>
			<th>
				<xsl:value-of select="vorname"></xsl:value-of>&#160;
				<xsl:value-of select="nachname"></xsl:value-of>
			</th>
		</tr>
	</xsl:template>
	<xsl:template match="buch">
		<table cellpadding="3">
			<xsl:apply-templates select="autor"></xsl:apply-templates>
			<tr>
				<td>
					<xsl:value-of select="titel"></xsl:value-of>
					<br></br>
					<em>Umfang:</em>&#160;
					<xsl:value-of select="umfang"></xsl:value-of> /
					<xsl:value-of select="seiten"></xsl:value-of> Seiten </td>
			</tr>
			<tr>
				<td>
					<xsl:value-of select="einband"></xsl:value-of> / 
					<xsl:value-of select="preis/@waehrung"></xsl:value-of>&#160; 
					<xsl:value-of select="preis"></xsl:value-of>
				</td>
			</tr>
		</table>
	</xsl:template>
</xsl:stylesheet>

Zur Verarbeitung/Transformation nutze ich ein einfaches Perl-Skript testXSLT.pl Aufruf: perl testXSLT.pl --xml=buch.xml --xsl=buch.xsl --ausgabe=buch.html

PERL-Datei: testXSLT.pl

!/perl/bin perl
=begin nd
	TITLE: Test XSLT
         FILE: testXSLT.pl
        USAGE: perl testXSLT.pl --xml=buch.xml --xsl=buch.xsl --ausgabe=buch.html 
  DESCRIPTION: XML::LibXSLT
	XML::LibXSLT basiert auf der schnellen und leistungsfähigen libxslt-Bibliothek des
	GNOME-Projekts. Um eine Transformation vorzunehmen, erzeugen Sie aus der XSLQuelle
	zuerst ein Stylesheet-Objekt und nutzen dieses dann zur Transformation einer
	XML-Datei.
    PARAMETER: 
			xml			- XML-Datei
			xsl			- XSL-Datei
			ausgabe	- Ausgabe-Datei
        NOTES: ---
       AUTHOR: Joachim Nyenhuis, joachim(at)nyenhuis(dot)org
      VERSION: 1.0
      CREATED: 29.09.2015 19:13:11
     		Topic: Hsitory
	29.09.2015 - Joachim Nyenhuis - Beginn Implementierung
=cut
use strict;
use warnings;
use utf8;
use Getopt::Long;
use XML::LibXSLT;
my $opt_xml			= "";
my $opt_xsl			= "";
my $opt_ausgabe	= "";
my $rc				= GetOptions( "xml=s"			=> \$opt_xml, 
					  "xsl=s"			=> \$opt_xsl, 
					  "ausgabe=s"	=> \$opt_ausgabe, 
					);
my $xslt = XML::LibXSLT->new;
my $stylesheet = $xslt->parse_stylesheet_file($opt_xsl);
my $results = $stylesheet->transform_file($opt_xml);
$stylesheet->output_file($results, $opt_ausgabe);

Ergebnis der Transformation ist die Datei buch.html Anzeige im Explorer buch.html:

xslt_html_ausgabe

Hinweise zum Aufbau des XSLT-Stylesheets

Hier eine grobe Beschreibung der Elemente die wir im Stylesheet buch.xsl verwenden. Eine datailierte Referenz erhaltet ihr -> siehe Links.

<xsl:stylesheet> alternativ <xsl:transform> diese beiden Elemente sind synonym Das oberste Element in einem Stylesheet ist das Element <xsl:stylesheet>. Das version-Attribut ist für dieses Element verpflichtend.
<xsl:output> Mithilfe des Elements können wir festlegen, welches Ausgabeformat der XSLT-Prozessor erzeugen soll.
<xsl:template> Ein Stylesheet wird immer eine oder mehre Templateregeln enthalten, wobei jedes Template durch das Element <xsl:template> und mit dessen match-Attribut definiert wird. Der Wert des match-Attributes ist ein Pattern, welches die Knoten bestimmt, für die die im Template definierten Regeln gelten.
<xsl:apply-templates> Das Element wird innerhalb eines Templates dazu verwendet an der Stelle andere Templates aufzurufen.
<xsl:value-of> Mit diesem Element können wir den Stringwert eines XPath-Ausdruckes ebenfalls in den Ergebnisbaum schreiben. Das Attribut select ist für dieses Element verpflichtend.

Links:

Wikipedia - XSL-Transformation
http://de.wikipedia.org/wiki/XSL_Transformation

XML/XSL/XSLT/ Einführung auf selfhtml.wiki
http://wiki.selfhtml.org/wiki/XML/XSL/XSLT/Einführung

XSLT-Referenz 2.0
http://data2type.de/xml-xslt-xslfo/xslt/xslt-referenz/

XSLT-Einführung in die Transformationssprache
http://www.data2type.de/xml-xslt-xslfo/xslt/xslt-einfuehrung/

Zurück