Ein komplexeres Beispiel
(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)
In Die Simple API for XML haben wir ein XML-Dokument erzeugt, das die Python-Klassen im PyXML-Paket darstellte (index.py). Die Datei pyxml.xml ist ein langes XML-Dokument, das sich gut für einen Test eignet.
In diesem Abschnitt konvertieren wir die Datei pyxml.xml zurück nach HTML, aber diesmal mit XSLT statt mit einem SAX-Treiber. Nachdem wir dies mit XSLT tun werden, wird der Ansatz mit SAX und Strings aus XML-Grundlagen im Vergleich dazu weit weniger mächtig erscheinen. Allerdings ist diese Art von Umwandlung genau das, wofür XSLT entworfen wurde. Die Grundstruktur des Dokuments pyxml.xml besteht aus einem file-Element, gefolgt von einem oder mehreren class-Elementen, gefolgt von einem oder mehreren Elementen mit einer Methodendefinition:
<file name="../xml/dom/ext/reader/HtmlLib.py">
<class name="class HtmlToDomParser(SGMLParser):">
<method name="def __init__(self):"/>
<method name="def unknown_starttag(self,tag,attrs):"/>
<method name="def unknown_endtag(self, tag):"/>
<method name="def handle_data(self, data):"/>
<method name="def handle_comment(self, comment):"/>
<method name="def handle_generic_node(self, node):"/>
<method name="def report_unbalanced(self, tag):"/>
<method name="def toDom(self, st, ownerDoc=None):"/>
</class>
</file>
Das obige XML stellt nur einige Zeilen der insgesamt 2600 Zeilen langen Datei dar. Das Stylesheet, mit dem dieses XML nach HTML konvertiert wird, benutzt eine Kombination von apply-templates- und value-of-Elementen, um die Struktur zu traversieren und eine passende Ausgabe zu generieren.
Das Stylesheet beginnt damit, die öffnenden und schließenden HTML-Tags zu erzeugen, und ruft dazwischen apply-templates auf, um damit den Inhalt einzufüllen:
<xsl:template match="pyxml">
<html>
<body bgcolor="#FFFFFF" text="#3333FF">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
Im nächsten Abschnitt werden drei separate Vorlagen definiert, eine für jeden von index.py erzeugten Elementtyp, die den Inhalt abfangen und die entsprechende HTML-Ausgabe generieren.
Datei-Vorlage
Um file-Elemente in pyxml.xml abzufangen, erzeugen Sie eine Vorlage, die auf den Elementnamen prüft. Sobald eine Übereinstimmung gefunden wird, wird HTML-Code formatiert, um den Namen der Datei in roter Schrift in einer neuen Tabellenzeile zu erzeugen:
<xsl:template match="file">
<p>
<table cellpadding="0" cellspacing="0" border="1" bordercolor="#000000" width="540">
<tr>
<td align="center">Quelldatei: <b class="filename"><xsl:value-of select="./@name"/></b></td>
</tr>
<xsl:apply-templates/>
</table>
</p>
</xsl:template>
Innerhalb der Vorlage wird ein value-of-Element mit einem Pfadausdruck benutzt, der auf das name-Attribut abzielt. Nachdem die Tabellenzeile komplett ist, wird apply-templates benutzt, um den Inhalt unter diesem Element einzufügen, der aus mehreren class- und method-Elementen bestehen kann.
Klassen-Vorlage
Die class-Vorlage erzeugt eine neue Tabellenzeile mit dem Klassennamen und gibt dann einfach diesen Klassennamen aus:
<xsl:template match="class">
<tr>
<td>Klasse: <b class="classname"><xsl:value-of select="./@name"/></b></td>
</tr>
<xsl:apply-templates/>
</xsl:template>
Wie zuvor gezeigt, wird die apply-templates-Anweisung dazu verwendet, weiteren Inhalt unterhalb dieses Elements einzufügen.
Methoden-Vorlage
Die method-Vorlage folgt auf dem Fuß und erzeugt ihr eigenes HTML, um damit Methodennamen anzuzeigen, nun aber in schwarzer Schrift:
Hier wird apply-templates nicht benutzt, weil es keine Kindelemente eines method-Elements im Dokument pyxml.xml gibt.
Das folgende Beispiel zeigt das komplette Listing von pyxml.xsl.
Beispiel: pyxml.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="pyxml">
<html>
<body bgcolor="#FFFFFF" text="#3333FF">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="file">
<p>
<table cellpadding="0" cellspacing="0" border="1" bordercolor="#000000" width="540">
<tr>
<td align="center">Quelldatei: <b><font color="#FF0000"><xsl:value-of select="./@name"/></font></b></td>
</tr>
<xsl:apply-templates/>
</table>
</p>
</xsl:template>
<xsl:template match="class">
<tr>
<td>Klasse: <b><xsl:value-of select="./@name"/></b></td>
</tr>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="method">
<tr>
<td align="left"><font color="#000000"><xsl:value-of select="./@name"/></font></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Wenn Sie die Transformation im obigen Beispiel pyxml.xsl ausführen, erzeugen Sie das Dokument pyxml.html, das alle Klassen im PyXML-Paket anzeigt.
C:\mein-dir> 4xslt pyxml.xml pyxml.xsl > pyxml.html
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema Python & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright © 2002 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Python & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de