1. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
IT-Zertifikat: Daten- und Metadatenstandards
Transformation von XML-Dokumenten mit XSLT (und XPATH)
XSLT – kurz und knackig
I.
Was ist XSLT?
XSL Transformation (XSLT) ist eine Programmiersprache zur Transformation
von XML-Dokumenten. Die rechtsstehende Grafik illustriert das Verfahren
der Umwandlung von XML-Dokumenten: Ein Eingabedokument (z.B. eine
Datei mit der Dateiendung xml) wird über den „XSLT-Prozessor“ in ein Zieloder Ausgabedokument umgewandelt.
Wie die Umwandlung stattzufinden hat, d.h. welche Elemente des
Eingabedokumentes sich schließlich im Ausgabedokument wiederfinden
sollen, das ist angegeben im XSLT-Code (i.e. eine Datei mit der Dateiendung
xslt, die XSLT-Anweisungen enthält).
II.
Wozu dient XSLT?
XSLT beschreibt die Umwandlung (z.B.) eines XML-Dokumentes in ein
anderes Dokument, z.B. eine XHTML-Website, XML, SVG, etc.
III.
Wie funktioniert die Umwandlung bzw. Transformation?
XSLT verwendet die Abfragesprache Xpath, um Teile eines XML-Dokumentes
zu adressieren. Die eigentliche Umwandlung findet im Hintergrund, z.B. im
Browser statt (darum brauchen wir uns nicht zu kümmern).
IV.
Wie funktioniert die Umwandlung bzw. Transformation nun genau?
Eine Transformation besteht aus einer Reihe von einzelnen Transformationsregeln, die als „Templates“
(„Schablonen“) bezeichnet werden. Ein Template besitzt ein auf XPath basierendes Pattern („Muster“), das
beschreibt, für welche Knoten es gilt, und einen Inhalt, der bestimmt, wie das Template seinen Teil des
Zielbaums erzeugt.
XSLT … und die Praxis
Beispiel I: Darstellung einer CD-Sammlung
Eine CD-Sammlung soll über eine XML-Entität repräsentiert werden. Jede CD ist charakterisiert durch die
Informationen (title, artist, label, year, previewimage, price, currency).
-1/6-
2. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
cdkatalog.xml (findet sich in den kursbegleitenden Materialien)
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cdkatalogschablone.xsd">
<cd previewimage="http://ecx.images-amazon.com/images/I/51e9ZoomINL._AA115_.jpg">
<title>Drukqs</title>
<artist>Aphex Twin</artist>
<label>Warp</label>
<price currency="EUR">10.90</price>
<year>2001</year>
</cd>
<cd previewimage="http://ecx.images-amazon.com/images/I/41BGQHT1ZEL._SL500_AA300_.jpg">
<title>I care because you do</title>
<artist>Aphex Twin</artist>
<label>Warp</label>
<price currency="EUR">20.99</price>
<year>1995</year>
</cd>
[…]
</catalog>
Transformation der durch XML repräsentierten Information: XSLT
1.: XML-Dokument um XSLT-Angabe ergänzen:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdkatalog.xslt"?>
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cdkatalogschablone.xsd">
<catalog>
[…]
-2/6-
3. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
2.: Neue Datei mit Dateiendung xslt anlegen (zu finden in den kursbegleitenden Materialien)
Ein XSL-Stylesheet beginnt immer mit der XMLDeklaration
cdkatalog.xslt
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html"/>
Definiert, dass das Dokument ein XSLT Stylesheet ist.
<xsl:template match="/">
<html>
Hier wird das Ausgabeformat (HTML) festgelegt.
<body>
<h2>Meine CD-Kollektion</h2>
<h3>CD I</h3>
Das <xsl:template> Element definiert ein
Titel: <xsl:value-of select="/catalog/cd[1]/title" />
Template. Das match=“/“ Attribut
<br />
verknüpft das Template mit dem
Künstler: <xsl:value-of select="/catalog/cd[1]/artist" />
Wurzelelement des XML-Dokumentes.
<br />
Label: <xsl:value-of select="/catalog/cd[1]/label" />
Der Inhalt von <xsl:template>
<br />
definiert die HTML-Ausgabe.
Jahr: <xsl:value-of select="/catalog/cd[1]/year" />
<br />
Bild: <xsl:value-of select="/catalog/cd[1]/@previewimage"/>
<h3>CD V</h3>
Zugriff auf das fünfte Element
Titel: <xsl:value-of select="/catalog/cd[5]/title" />
(„/catalog/cd[5]/title“) der XML-Datei.
<br />
Künstler: <xsl:value-of select="/catalog/cd[5]/artist" />
<br />
Zugriff auf den Wert des Attributes
Label: <xsl:value-of select="/catalog/cd[5]/label" />
„previewimage“ von <cd>.
<br />
Jahr: <xsl:value-of select="/catalog/cd[5]/year" />
<br />
Bild: <xsl:value-of select="/catalog/cd[5]/@previewimage"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
-3/6-
4. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
XPath
In der oben wiedergegebenen XSLT-Datei werden XPath-Ausdrücke verwendet, um auf Elemente des XML-Baumes
zuzugreifen, z.B. auf die erste CD des CD-Kataloges („<xsl:value-of select="/catalog/cd[5]/“). Die Selektion von
Elementen des XML-Baumes funktioniert nach der folgenden Logik:
Knoten auswählen: Pfadausdrücke
Ausdruck
Beschreibung
nodename
/
//
.
..
@
Wählt alle Kindknoten des bezeichneten Knotens
Wählt den Wurzelknoten aus
Wählt den bezeichneten Knoten aus – egal, wo sich der Knoten befindet
Wählt den aktuellen Knoten aus
Wechsel zum Elternknoten des aktuell angewählten Knotens
Auswahl von Attributen
Auf das CD-Beispiel übertragen:
<catalog>
<cd previewimage="http://ecx.images-amazon.com/images/I/51bnHWsisxL._SL500_AA300_.jpg">
<title>The Campfire Headphase</title>
<artist>Boards of Canada</artist>
<label>Warp</label>
<price currency="EUR">16.99</price>
<year>2005</year>
</cd>
</catalog>
Ausdruck
Beschreibung
catalog
/catalog
Alle Kindknoten von <catalog> auswählen
Wählt das Wurzelelement „catalog“ aus. Achtung, startet die Pfadangabe mit /, so ist
damit der absolute Pfad zu einem Element bezeichnet.
Wählt alle <cd> Elemente aus, die Kindelemente sind von <catalog>
Wählt alle <cd> Elemente aus – egal, wo sich die Elemente befinden
Wählt alle <cd> Elemente unterhalb des Elementes <catalog> aus – egal, wo sich die
Elemente befinden
Wählt alle Attribute mit der Bezeichnung „previewimage“ aus
catalog/cd
//cd
catalog//cd
//@previewimage
-4/6-
5. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
Prädikate
Prädikate werden verwendet, um spezifische Knoten zu finden bzw. Knoten ausfindig zu machen, die einen
bestimmten Wert enthalten. Prädikate werden umschlossen von eckigen Klammern. Beispiele für Prädikate:
Ausdruck
Ergebnis
/catalog/cd[1]
/catalog/cd[last()]
/catalog/cd[last()-1]
//price[@currency]
//price[@currency ='EUR']
Wählt das erste <cd> Element aus, das Kindelement ist von <catalog>
Wählt das letzte <cd> Element aus, das Kindelement ist von <catalog>
Wählt das vorletzte <cd> Element aus, das Kindelement ist von <catalog>
Wählt alle <price> Elemente aus, die über ein Attribut „currency“ verfügen
Wählt alle <price> Elemente aus, die über ein Attribut „currency“ mit dem
Attributwert „EUR“ verfügen
Auswahl unbekannter Knoten
XPath Wildcards können verwendet werden, um unbekannte Elemente zu adressieren:
Wildcard
Beschreibung
*
@*
node()
Entspricht einem beliebigen Elementknoten
Entspricht einem beliebigen Attributknoten
Entspricht einem Knoten jeglicher Art
Beispiele:
Pfadausdruck
Result
/catalog/*
//*
//price[@*]
Wählt alle Kindknoten des <catalog> Elementes aus
Wählt alle Elemente im XML-Dokument aus
Wählt alle <price> Elemente aus, die über ein Attribut verfügen
-5/6-
6. Universität zu Köln
Historisch-Kulturwissenschaftliche Informationsverarbeitung
IT-Zertifikat der Phil.-Fak.: Advanced Markup & Metadata
Jan G. Wieners, MA - jan.wieners@uni-koeln.de
Probleme und ihre Lösungen / Code-Snippets
I. Wie lässt sich der Attributwert von „previewimage“ in das HTML Bild-Tag <img> einbetten?
Lösung: <xsl:attribute>
Beispiel: <img> Tag um src-Attribut ergänzen
<img>
<xsl:attribute name="src"><xsl:value-of select="/catalog/cd[5]/@previewimage"/></xsl:attribute>
</img>
II. Wie lässt sich die Anzahl von Elementen im XML-Dokument bestimmen?
Lösung: count
Beispiel: Ausgabe der Anzahl von <cd> Tags:
<h3>Titel (<cd> Tags) in XML-Datenbasis:
<xsl:variable name="Anzahl_CDs" select="/catalog/cd"/>
<xsl:value-of select="count($Anzahl_CDs)"/>
</h3>
III. Wie lassen sich alle Elemente des XML-Dokumentes traversieren, ohne die Nummer des Elementes explizit
angeben zu müssen?
Lösung: <xsl:for-each select=““>
Beispiel: Ausgabe aller <cd> Elemente und Zugriff auf Kindelemente:
<xsl:for-each select="/catalog/cd">
Titel: <xsl:value-of select="title" /> <br />
Künstler: <xsl:value-of select="artist" /> <br />
Bildurl: <xsl:value-of select="@previewimage"/>
</xsl:for-each>
IV. Nummer des aktuell verarbeiteten Elementes ausgeben
Lösung: position()
Beispiel:
<xsl:for-each select="/catalog/cd">
<h3>CD <xsl:value-of select="position()" />
</xsl:for-each>
Die Kurzreferenz unter http://www.helmut-vonhoegen.de/Kurzreferenz_XSLT.pdf bietet einen feinen Überblick über
die XSLT-Funktionalität.
-6/6-