Die XSLT-Story

Stellt euch vor, ihr habt ein WordPress-Plugin geschrieben, das eine XML-Datei aufarbeitet um dessen Inhalt für den Betrachter sinnvoll lesbar auf einer Webseite darstellt. Nachdem mit den Testdaten alles wunderbar funktioniert spielst du Echtdaten ein und schaltest das System produktiv. Es funktioniert tatsächlich noch immer wunderbar, aber dir fällt doch auf, das da sehr viel unnötiges in der gelieferten XML-Datei steht, da in diese tatsächlich jedes vorhandene und theoretisch füllbare Feld exportiert wird.
Beispiel: Es geht um Kurse. Die könnten ja zu jedem Termin an einem anderen Ort stattfinden. Macht viel Sinn, wenn das so ist. Bei uns ist es nicht so, und daher sind diese Daten schon mal überflüssig.
Noch ein Beispiel: Die Kontaktdaten der Dozenten. Das ist nicht nur kosmetischer Ballast. Die möchte ich tatsächlich in keinster Weise online stellen. Daten, die erst gar nicht da sind, sind dann auch in keinster Weise missbräuchlich auszulesen. Old School Security. Und ganz nebenbei wird die Daten liefernde Datei wieder etwas schmaler. Denn diese hat mit einigen MB doch einen überraschenden Umfang erreicht.
Nun kommst du in deinem jugendlichen Datenleichtsinn auf die Idee, das doch einer der unzähligen XML-Editoren in der Lage sein könnte solche überflüssigen Knoten konsequent aus der Datei zu entfernen. Diese Hoffnung musste ich nach einer längeren Sitzung mit einer bekannten Suchmaschine und der Installation einiger Anwendungen jedoch tatsächlich aufgeben. Zu meiner Verwirrung, wie ich noch immer feststellen muss. Denn für so besonders halte ich meinen Wunsch nun wirklich nicht. Aber es ist wie es ist. Also musste ich ein noch intensiveres Gespräch mit der bekannten Suchmaschine führen. Apropos Gespräch – Ob Siri, Cortana & Co mir schon brauchbare Antworten auf meine Frage geliefert hätten? „Hey Alexa, ich möchte wiederkehrende Knoten aus einer XML-Datei entfernen, wie mache ich das am besten?“
Ich hab es – ganz Old Style – mit klassischem eintippen versucht und bin zuerst durch einen Dschungel an Lösungen für so ziemlich jede Programmiersprache dieses Planeten geirrt. Um dann aber der Tatsache bewusst zu werden, das XML mit XSLT das nötige Werkzeug tatsächlich mehr oder weniger mitliefert.

Inzwischen hatte die bekannte Suchmaschine wohl begriffen, das es mir erst war und lieferte mir folgenden Link:
http://www.microhowto.info/howto/process_an_xml_document_using_an_xslt_stylesheet.html

Process an xml document using an xslt stylesheet – Was für ein schöner Satz!

Das Tutorial beginnt mit:

Scenario

Suppose that you have an XML document called input.xml that you wish to process using an XSLT stylesheet called style.xsl to produce a new XML document called output.xml.

Inzwischen hatte sich auch mein Ansatz entsprechend ein wenig verschoben. Wenn ich aus einer Datei geschätzte 90% der hinterlegten Informationen eliminieren will, dann macht es wahrscheinlich mehr Sinn, die zu verbleibenden 10% zu definieren.
Der Blick in ein XSL-Tutorial offenbart geradezu erschreckendes. Ist das Einfach! Eine Schleife und ein paar Zeilen Fleißarbeit. Das Stylesheet ist wesentlich schneller geschrieben als die Suche nach der Methode bis hier gedauert hat.

Das hier ist schon alles.

<?xml version="1.0" encoding="windows-1252"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/kurse">
    <kurse>
        <xsl:for-each select="kurs">
            <kurs>
                <knr>
                    <xsl:value-of select="knr"/>
                </knr>
                <fachb>
                    <xsl:value-of select="fachb"/>
                </fachb>
                <fachbtext>
                    <xsl:value-of select="fachbtext"/>
                </fachbtext>
                <haupttitel>
                    <xsl:value-of select="haupttitel"/>
                </haupttitel>
                <inhalt>
                    <xsl:value-of select="inhalt"/>
                </inhalt>
                <mitarbeiter_planend>
                    <xsl:value-of select="mitarbeiter_planend"/>
                </mitarbeiter_planend>
                <ort>
                    <xsl:value-of select="ort"/>
                </ort>
                <ortaussenstelle>
                    <xsl:value-of select="ortaussenstelle"/>
                </ortaussenstelle>
                <ortraumname>
                    <xsl:value-of select="ortraumname"/>
                </ortraumname>
                <ortgebaeude>
                    <xsl:value-of select="ortgebaeude"/>
                </ortgebaeude>
                <ortstr>
                    <xsl:value-of select="ortstr"/>
                </ortstr>
                <ortplz>
                    <xsl:value-of select="ortplz"/>
                </ortplz>
                <ortname>
                    <xsl:value-of select="ortname"/>
                </ortname>
                <beginndat>
                    <xsl:value-of select="beginndat"/>
                </beginndat>
                <endedat>
                    <xsl:value-of select="endedat"/>
                </endedat>
                <beginnuhr>
                    <xsl:value-of select="beginnuhr"/>
                </beginnuhr>
                <endeuhr>
                    <xsl:value-of select="endeuhr"/>
                </endeuhr>
                <dauer>
                    <xsl:value-of select="dauer"/>
                </dauer>
                <termine>
                    <xsl:for-each select="termine/termin">
                        <termin>
                        <tag>
                            <xsl:value-of select="tag"/>
                        </tag>
                        <zeitvon>
                            <xsl:value-of select="zeitvon"/>
                        </zeitvon>
                        <zeitbis>
                            <xsl:value-of select="zeitbis"/>
                        </zeitbis>
                        </termin>
                    </xsl:for-each>
                </termine>
                <tnmax>
                    <xsl:value-of select="tnmax"/>
                </tnmax>
                <tnmin>
                    <xsl:value-of select="tnmin"/>
                </tnmin>
                <tnanmeldungen>
                    <xsl:value-of select="tnanmeldungen"/>
                </tnanmeldungen>
            </kurs>
        </xsl:for-each>
    </kurse>
</xsl:template>
</xsl:stylesheet>

Apple liefert den nun noch benötigten Processor als Kommandozeilentool in OS X freundlicherweise (noch) mit. Ich bin trotzigerweise noch bei 10.8.5, und dort ist xsltproc einfach so da.
Wa schön ist, denn damit kann man mit einem einfach Anufruf á la:

$ xsltproc -o output.xml style.xsl input.xml

zu dem von mir gewünschten Ergebnis kommen.

Problem solved!

Statt langer Suche, hätte möglicherweise bewusstes lesen der Informationen, die jemand in der Wikipedia hat liegen lassen, direkt helfen können.
Dort steht im XML Eintrag zu Transformation und Darstellung von XML-Dokumenten:
„Ein XML-Dokument kann mittels geeigneter Transformationssprachen wie XSLT oder DSSSL in ein anderes Dokument transformiert werden.“
Und dieses andere Dokument kann nun eben auch ein anderes XML-Dokument sein. Hier eines, das nur die individuell benötigten Knoten der Ursprungsdatei enthält.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*