Deutsch English
Dein Feedback:
Hat die Seite Deine Erwartung erfüllt? vote3 Ja
vote2 Teilweise
vote1 Nein
Noch ein Kommentar?

Nur falls, Du eine Antwort erwartest, Deine E-Mailadresse

Gegebenenfalls noch Dein Name

Do not change this:
Feedback
Suchen

XML XSLT

Diese Seite beschäftigt sich damit wie man seine Daten in einer validen XML Datei speichert um sie später jederzeit mit Hilfe von XSLT leicht in beliebige andere Formate konvertieren zu können.
Zur Veranschaulichung benutzen wird als Beispiel eine kleine Adressliste bestehend aus dem Namen, dem Geschlecht und beliebig vielen Telefonnummern.
24-10-2005 13.22

Die Grammatik

Damit ein gemeinsames Verständnis darüber besteht, wie unsere XML Datei aufgebaut werden soll, definiert man als erstes ihren Aufbau.

XML Grammatik mit DTD

Man kann den Aufbau der XML Datei über eine Document Type Definition (DTD) Datei definieren.

<!ELEMENT mylist (Person*)>
<!ELEMENT Person (Name, Geschlecht?, Telefon*)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Telefon (#PCDATA)>
<!ATTLIST Telefon
type CDATA #IMPLIED
>
Damit haben wir eine Adressliste, bestehend aus beliebig (auch Null) vielen Personen. Eine Person besteht aus einem Namen, optional einen Geschlecht und beliebig (auch Null) vielen Telefonnummern. Eine Telefonnummer kann als Parameter einen Typ haben.
Siehe auch

XML Grammatik mit XSD

Viel leistungsfähiger ist dagegen ein XML Schema (XSD) zur Definition des Aufbaus einer XML Datei. Eine XSD Datei ist selbst wieder eine XML Datei.

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="mylist" type="MyContactsType" />

<xsd:complexType name="MyContactsType">
<xsd:sequence>
<xsd:element name="Person" type="PersonType" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="PersonType">
<xsd:element name="Name" type="xsd:string" maxOccurs="1" minOccurs="1"/>
<xsd:element name="Geschlecht" maxOccurs="1" minOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="F"></xsd:enumeration>
<xsd:enumeration value="M"></xsd:enumeration>
<xsd:enumeration value="?"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Telefon" type="TelefonType" maxOccurs="unbounded" />
</xsd:complexType>

<xsd:complexType name="TelefonType">
<xsd:attribute name="type">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Mobile"></xsd:enumeration>
<xsd:enumeration value="Private"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>

</xsd:schema>
14-08-2011 23.12

Eine XML Datei schreiben

Jetzt brauchen wir einem XML Datei in die die eigentlichen Daten kommen. Der Aufbau muss sich dabei den Regeln unserer Grammatik unterwerfen.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mylist SYSTEM "mylist.dtd">

<mylist>

<Person>
<Name>John Doe</Name>
<Geschlecht>M</Geschlecht>
<Telefon type="Mobil">555 123</Telefon>
<Telefon>555 647</Telefon>
</Person>

<Person>
<Name>Jane Doe</Name>
<Geschlecht>F</Geschlecht>
</Person>

</mylist>

Siehe auch:
28-10-2005 00.41

Eine xsl Datei schreiben


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" /><xsl:template match="/">

<xsl:template match="/">

<xsl:for-each select="tgadressbuch/Person">
<xsl:sort select="Nachname"/>
<xsl:sort select="Vorname"/>

<xsl:apply-templates select="Nachname"/>
<xsl:apply-templates select="Vorname"/>
<xsl:apply-templates select="Telefonnummer"/>

</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

Damit könnte man durch alle Einträge aus der xml Datei laufen und sie einfach hintereinander ausgeben. Das geht aber auch ganz ohne for-each:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" /><xsl:template match="/">

<xsl:template match="/">
<xsl:apply-templates select="Person">
<xsl:sort select="Nachname"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="Person">
<xsl:apply-templates select="Nachname"/>
<xsl:apply-templates select="Vorname"/>
<xsl:apply-templates select="Telefonnummer"/>
</xsl:template>

</xsl:stylesheet>

Man kann auch je nach Inhalt der xml Datei andere Inhalte ausgebe:

<xsl:choose>
<xsl:when test="Geschlecht='M'">
Frau!
</xsl:when>
<xsl:when test="Geschlecht='F'">
Mann!
</xsl:when>
<xsl:otherwise>
Keine Person.
</xsl:otherwise>
</xsl:choose>

Oder nur bestimmte Teile überhaupt betrachten:

<xsl:apply-templates select="Telefon[not(Telefon='555 123')]"
<xsl:apply-templates select="Telefon[Telefon[(@type='Mobil')]">

So kann man sich ein neues Element samt Attribut zusammensetzten lassen:

<xsl:element name = "a" >
<xsl:attribute name = "href">
http://www.example.com
<xsl:apply-templates />
</xsl:attribute>
Ein Link
</xsl:element>

Art und Formatierung der Ausgabe festlegen
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:output method="text" />

Siehe auch
21-10-2006 16.43

Aus xml und xslt eine neue Datei erzeugen

Z.B. mit xsltproc:
xsltproc -o output.txt my_xslt.xsl data.xml

XML Datei gegen ein Schema validieren

xmllint --noout --schema myschema.xsd myfile.xml
18-05-2008 15.06

Anwendungen

Ein Element umbenennen

Man hat z.B. das hier
<foo a="5"> ...
</foo>
und möchte es in das umbennen
<bar a="5">
...
</bar>
Lösung
<xsl:template match="foo"> <xsl:element name="bar">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Also einfach wenn man foo liest ein bar schreiben. Der Trick ist mit dem copy-of die Attribute zu kopieren.

Eine Funktion bauen

Man kann eine Funktion nachbauen und dieser sogar Parameter übergeben. Diese Parameter sind aber Nodesets und keine Strings. Daher ist es ohne Erweiterungen (zur Zeit?) nicht möglich z.B. einfach einen konstanten String mit einer der Variablen zu konkatenieren.
<xsl:variable name="var1" select="//FOO/BAR/text()"    />
<xsl:variable name="var2">//AAA/CCC/text()</xsl:variable>

<xsl:template match="/">
<xsl:call-template name="function">
<xsl:with-param name="var3" select="//FOO/BAR/" />
<xsl:with-param name="var4">//FOO/BAR/</xsl:with-param>
</xsl:call-template>
</xsl:template>

<xsl:template name="function">
<xsl:param name="var3"/>
<xsl:param name="var4"/>

<xsl:value-of select="$var1"/>
<xsl:value-of select="$var2"/>
<xsl:value-of select="$var3"/>
<xsl:value-of select="$var4"/>

</xsl:template>

Modes

<xsl:template  match="/foo">
<xsl:apply-templates select="bar" mode="m1"/>
<xsl:apply-templates select="bar" mode="m2"/>
<xsl:apply-templates select="bar" mode="m3"/>
</xsl:template>

<xsl:template match="bar" mode="m1">
...
</xsl:template>

<xsl:template match="bar" mode="m2">
...
</xsl:template>

<xsl:template match="bar" mode="m3">
...
</xsl:template>

Match Beispiele

<xsl:template match="foo|bar|blub"   >
<xsl:template match="foo[@bar='bar']">
<xsl:template match="foo[bar]" >
01-09-2007 22.34
Powered by PHP Created with Xemacs Valid XHTML 1.0! Valid CSS!