Kontakt:
Thorsten Gunkel
63456 Hanau
Deutschland
Mail
Stimm ab und hilf mit diese Seite zu verbessern!Hat die Seite Deine Erwartung erfüllt?
Schreibe Deinen Kommentar doch einfach in das
Gästebuch.
Letzte Änderung: 18-05-2008 15.06
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
Als erstes stellen wir erklären wir in einer DTD Datei den Aufbau unsere XML Datei.
<!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
28-10-2005 01.02
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
<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
Z.B. mit
xsltproc:
xsltproc -o output.txt my_xslt.xsl data.xml
xmllint --noout --schema myschema.xsd myfile.xml
18-05-2008 15.06
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.
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>
<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>
<xsl:template match="foo|bar|blub" >
<xsl:template match="foo[@bar='bar']">
<xsl:template match="foo[bar]" >
01-09-2007 22.34