XML transformieren
Moin
Ich hätte da noch eine Anregung, und was zum anschubsen...
XML kennen ja schon eine Menge Leute, aber wer weiss schon wie mans richtig anwendet?
Deswegen verkümmert XML meistens als so eine Art Datenbankformat oder Konfigurationsdatei.
Aber in Wirklichkeit ist XML eine frei transformierbare Auszeichnungssprache.
Wohlgeformt besteht eine transformierbare XML aus drei Dateien: XML DTD und XSL
Bestimmt ist dem eifrigen Leser aufgefallen,
wenn er sich eine XML im Webbrowser lädt,
das nur eine baumartige Struktur angezeigt wird.
Das liegt am Fehlen der Transformationsdatei, auch Stylesheet genannt.
....gleich mehr dazu, bin auf Arbeit, jetzt geh ich eine rauchen.
So, weiter gehts...
Lange rede, kurzer Sinn, um XSL als Stylesheet in XML einzubinden reicht eine Zeile...
server.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
[B][COLOR="#B22222"]<?xml-stylesheet version="1.0" href="SnomIPPhoneText.xsl" type="text/xsl" ?>[/COLOR][/B]
<SnomIPPhoneText dtmf="yes" speedselect="select" clearlight="true" state="relevant">
<Led number="1">On</Led>
<Led number="2">On</Led>
<Led number="3">On</Led>
<Led number="4">On</Led>
<Led number="5">On</Led>
<Led number="6">On</Led>
<Led number="7">On</Led>
<Led number="8">On</Led>
<Led number="9">On</Led>
<Led number="10">On</Led>
<Led number="11">On</Led>
<Led number="12">On</Led>
<Fetch mil="2000">http://fritz.box:4200/snom320/menu.xml</Fetch>
<Title></Title>
<Prompt></Prompt>
<Text>Nummernkarussel</Text>
</SnomIPPhoneText>
...und wer noch nie XSL gesehn hat, wird sich jetzt wundern...
SnomIPPhoneText.xsl
Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="head">
<xsl:element name="title"><xsl:value-of select="/SnomIPPhoneText/Title" /></xsl:element>
<xsl:element name="meta">
<xsl:attribute name="http-equiv"><xsl:text>content-type</xsl:text></xsl:attribute>
<xsl:attribute name="content"><xsl:text>application/xhtml+xml; charset=UTF-8</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="link">
<xsl:attribute name="rel"><xsl:text>stylesheet</xsl:text></xsl:attribute>
<xsl:attribute name="media"><xsl:text>screen</xsl:text></xsl:attribute>
<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
<xsl:attribute name="href"><xsl:text>/css/xml.css</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="link">
<xsl:attribute name="rel"><xsl:text>shortcut icon</xsl:text></xsl:attribute>
<xsl:attribute name="type"><xsl:text>image/x-ico</xsl:text></xsl:attribute>
<xsl:attribute name="href"><xsl:text>/img/favicon.ico</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="style">
<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
*{margin:0px 0px 0px 0px;
padding:0px 0px 0px 0px;
text-align:center;}
table,th,td{margin:1px 1px 1px 1px;
padding:1px 1px 1px 1px;
border-collapse:collapse;}
th,td{white-space:nowrap;}
table{width:99.80%;}</xsl:element>
</xsl:element>
<!--SnomIPPhoneText-->
<xsl:element name="body">
<table>
<xsl:element name="caption">SnomIPPhoneText</xsl:element>
<thead>
<tr>
<th>Title</th>
<th>Prompt</th>
<th>Text</th>
<th>Fetch</th>
</tr>
</thead>
<tfoot>
<tr>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneText/Title)" /></td>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneText/Prompt)" /></td>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneText/Text)" /></td>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneText/Fetch)" /></td>
</tr>
</tfoot>
</table>
<table>
<xsl:element name="caption">Led</xsl:element>
<thead>
<tr>
<th>Nr</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="/SnomIPPhoneText/Led">
<tr>
<td><xsl:value-of select="@number"/></td>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
...das Ganze ezeugt im Webbrowser folgende XHTML Ausgabe:
Das ist eine Transformation in XHTML für SnomIPPhoneText, jetzt noch eine für SnomIPPhoneDirectory...
menu.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
[B][COLOR="#B22222"]<?xml-stylesheet version="1.0" href="SnomIPPhoneDirectory.xsl" type="text/xsl" ?>[/COLOR][/B]
<SnomIPPhoneDirectory dtmf="yes" speedselect="select" clearlight="true" state="relevant">
<Led number="1">Off</Led>
<Led number="2">On</Led>
<Led number="3">Off</Led>
<Led number="4">On</Led>
<Led number="5">Off</Led>
<Led number="6">On</Led>
<Led number="7">Off</Led>
<Led number="8">On</Led>
<Led number="9">Off</Led>
<Led number="10">On</Led>
<Led number="11">Off</Led>
<Led number="12">On</Led>
<Fetch mil="2000">http://fritz.box:4200/snom320/menu1.xml</Fetch>
<Title></Title>
<Prompt></Prompt>
<DirectoryEntry>
<Name>Status EMail</Name>
<Telephone>mail</Telephone>
</DirectoryEntry>
<DirectoryEntry>
<Name>Anrufbeantworter 1</Name>
<Telephone>**600</Telephone>
</DirectoryEntry>
<DirectoryEntry>
<Name>Anrufbeantworter 2</Name>
<Telephone>**601</Telephone>
</DirectoryEntry>
<DirectoryEntry>
<Name>Anrufbeantworter 3</Name>
<Telephone>**602</Telephone>
</DirectoryEntry>
<DirectoryEntry>
<Name>Anrufbeantworter 4</Name>
<Telephone>**603</Telephone>
</DirectoryEntry>
<DirectoryEntry>
<Name>Anrufbeantworter 5</Name>
<Telephone>**604</Telephone>
</DirectoryEntry>
</SnomIPPhoneDirectory>
SnomIPPhoneDirectory.xsl
Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="head">
<xsl:element name="title"><xsl:value-of select="/SnomIPPhoneDirectory/Title" /></xsl:element>
<xsl:element name="meta">
<xsl:attribute name="http-equiv"><xsl:text>content-type</xsl:text></xsl:attribute>
<xsl:attribute name="content"><xsl:text>application/xhtml+xml; charset=UTF-8</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="link">
<xsl:attribute name="rel"><xsl:text>stylesheet</xsl:text></xsl:attribute>
<xsl:attribute name="media"><xsl:text>screen</xsl:text></xsl:attribute>
<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
<xsl:attribute name="href"><xsl:text>/css/xml.css</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="link">
<xsl:attribute name="rel"><xsl:text>shortcut icon</xsl:text></xsl:attribute>
<xsl:attribute name="type"><xsl:text>image/x-ico</xsl:text></xsl:attribute>
<xsl:attribute name="href"><xsl:text>/img/favicon.ico</xsl:text></xsl:attribute>
</xsl:element>
<xsl:element name="style">
<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
*{margin:0px 0px 0px 0px;
padding:0px 0px 0px 0px;
text-align:center;}
table,th,td{margin:1px 1px 1px 1px;
padding:1px 1px 1px 1px;
border-collapse:collapse;}
th,td{white-space:nowrap;}
table{width:99.80%;}</xsl:element>
</xsl:element>
<!--SnomIPPhoneDirectory-->
<xsl:element name="body">
<table>
<xsl:element name="caption">SnomIPPhoneDirectory</xsl:element>
<thead>
<tr>
<th>Title</th>
<th>Prompt</th>
<th>Fetch</th>
</tr>
</thead>
<tfoot>
<tr>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneDirectory/Title)" /></td>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneDirectory/Prompt)" /></td>
<td><xsl:value-of select="normalize-space(/SnomIPPhoneDirectory/Fetch)" /></td>
</tr>
</tfoot>
</table>
<table>
<xsl:element name="caption">Led</xsl:element>
<thead>
<tr>
<th>Nr</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="/SnomIPPhoneDirectory/Led">
<tr>
<td><xsl:value-of select="@number"/></td>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
<table>
<xsl:element name="caption">DirectoryEntry</xsl:element>
<thead>
<tr>
<th>Name</th>
<th>Nummer</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="/SnomIPPhoneDirectory/DirectoryEntry">
<tr>
<td><xsl:value-of select="Name"/></td>
<td><xsl:value-of select="Telephone"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
...erzeugt diese Ausgabe:
Dokumentiert ist die ganze Geschichte auch sehr gut auf:
de.selfhtml.org
PS: Bitte nicht übers Design meckern, mir gehts um die Technik, nicht ums Aussehen.