Home > Artikel > Ausgabe 3/2019 > Kategorie-XML-Export mit Transformation

Kategorie-XML-Export mit Transformation

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wie Sie die Daten aus Access-Tabellen mithilfe von Abfragen in die gewünschten Form bringen, wissen Sie bereits. Dazu eignen sich beispielsweise Auswahl- oder Kreuztabellenabfragen. Sie können aber auch die Inhalte von XML-Dokumenten ganz nach Ihren Wünschen strukturieren. Alles, was Sie benötigen, ist eine passende Transformation. Die notwendigen Informationen landen in einer XSL-Datei und beschreiben, wie die Daten des XML-Dokuments ausgegeben werden sollen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1903_KategorieXMLExportMitTransformation.zip.

Einstiegsbeispiel

Im Artikel XML: Austausch mit Access-Bordmitteln haben wir einen Export in eine XML-Datei definiert, der die Daten der Tabellen tblKategorien und tblArtikel enthält. Das resultierende XML-Dokument enthält Elemente namens tblKategorien, die in Unterelementen die Feldinhalte der Felder dieser Tabelle enthalten sowie weitere Unterelemente namens tblArtikel, welche die Artikel der jeweiligen Kategorie inklusive aller Feldwerte auflistet. Das Ergebnis sieht in stark gekürzter Form etwa wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>

<dataroot ...>

<tblKategorien>

<KategorieID>1</KategorieID>

<Kategoriename>Getränke</Kategoriename>

<Beschreibung>Alkoholfreie Ge ...</Beschreibung>

<Abbildung>FRwvAAIAAAANAA4AFAAhAPAgS...</Abbildung>

<tblArtikel>

<ArtikelID>1</ArtikelID>

<Artikelname>Chai</Artikelname>

...

</tblArtikel>

<tblArtikel>

...

</tblArtikel>

...

</tblKategorien>

<tblKategorien>

...

</tblKategorien>

</dataroot>

Wir möchten hier durch die Angabe einer XSL-Datei einige Änderungen an der Ausgabe erwirken. So soll etwa das Wurzelelement nicht dataroot heißen, sondern Bestellverwaltung. Die Elemente tblKategorien und tblArtikel sollen Kategorie und Artikel heißen. Außerdem soll der jeweilige Primärschlüsselwert nicht in einem eigenen Element namens KategorieID beziehungsweise ArtikelID landen, sondern in einem Attribut namens ID im jeweils übergeordneten Element Kategorie beziehungsweise Artikel. Außerdem wollen wir der Übersicht halber nur die Felder Kategoriename und Beschreibung der Tabelle tblKategorien sowie das Feld Artikelname der Tabelle tblArtikel als eigene Elemente in das XML-Dokument aufnehmen. Außerdem, das ist uns als Mensch im Gegensatz zur Maschine besonders wichtig, sollen die Elemente entsprechend der Hierarchie eingerückt dargestellt werden.

Das Ergebnis soll also etwa wie folgt aussehen:

<?xml version="1.0" encoding="UTF-16"?>

<Bestellverwaltung ...>

<Kategorie ID="1">

<Kategoriename>Getränke</Kategoriename>

<Beschreibung>Alkoholfreie Getränke, Kaffee, Tee, Bier</Beschreibung>

<Artikel ID="1">

<Artikelname>Chai</Artikelname>

</Artikel>

<Artikel ID="2">

<Artikelname>Chang</Artikelname>

</Artikel>

...

</Kategorie>

<Kategorie ID="2">

...

</Kategorie>

...

</Bestellverwaltung>

Selektieren und Formatieren per XSL-Datei

Die XSL-Datei, die wir verwenden, sieht in der Übersicht wie in Listing 1 aus. Wir werden diese nun analysieren.

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40">

   <xsl:template match="dataroot">

     <Bestellverwaltung>

       <xsl:text>

       </xsl:text>

       <xsl:for-each select="tblKategorien">

         <Kategorie>

           <xsl:attribute name="ID">

             <xsl:value-of select="KategorieID"/>

           </xsl:attribute>

           <xsl:text>

           </xsl:text>

           <Kategoriename>

             <xsl:value-of select="Kategoriename"/>

           </Kategoriename>

           <xsl:text>

           </xsl:text>

           <Beschreibung>

             <xsl:value-of select="Beschreibung"/>

           </Beschreibung>

           <xsl:text>

           </xsl:text>

           <xsl:for-each select="tblArtikel">

             <Artikel>

               <xsl:attribute name="ID">

                 <xsl:value-of select="ArtikelID"/>

               </xsl:attribute>

               <xsl:text>

               </xsl:text>

               <Artikelname>

                 <xsl:value-of select="Artikelname"/>

               </Artikelname>

               <xsl:text>

               </xsl:text>

           </Artikel>

           <xsl:text>

           </xsl:text>

           </xsl:for-each>

         </Kategorie>

         <xsl:text>

         </xsl:text>

       </xsl:for-each>

     </Bestellverwaltung>

   </xsl:template>

</xsl:stylesheet>

Listing 1: XSL-Datei zum Erreichen unserer Vorgaben

Es gibt grundsätzlich zwei verschiedene Typen von Zeilen: Diejenigen, die mit xsl: beginnen, enthaltenen Steueranweisungen. Diese werden ausgeführt, aber nicht in das Zieldokument übernommen. Die übrigen beginnen nicht mit xsl: und werden so, wie Sie in der XSL-Datei enthalten sind, in das Zieldokument geschrieben.

So landet die erste Zeile, die mit <?xml beginnt, direkt im Zieldokument. Die folgende Zeile enthält hingegen ähnlich wie die erste, für das Zieldokument bestimmte Zeile, Informationen wie etwa die XSL-Version.

Danach folgt die erste Anweisung, die eine Funktion ausführt. Sie enthält das Schlüsselwort xsl:template, was besagt, dass wir nun ein Template definieren, also eine Vorlage für den einzufügenden Inhalt. Das Attribut match gibt an, für welches Element unser Inhalt eingesetzt werden soll, in diesem Fall für das Element dataroot:

<xsl:template match="dataroot">

Das heißt, wenn wir nun zwischen dem öffnenden und dem schließenden xsl:template-Element etwa nur das folgende Element einfüge, wird das komplette dataroot-Element im ursprünglichen XML-Dokument durch das Element <Bestellverwaltung/> ersetzt:

<xsl:template match="dataroot">

<Bestellverwaltung/>

</xsl:template>

Aber wir wollen ja noch einige Informationen integrieren. Wichtig ist an dieser Stelle zu verstehen, dass wir tatsächlich das komplette vorhandene dataroot-Element und alle untergeordneten Elemente rauswerfen und das Dokument komplett neu aufbauen.

Dazu gehen wir weiter, indem wir das Element <Bestellverwaltung> als neues Wurzelelement anlegen (es beginnt nicht mit xsl: also wird es direkt so eingefügt):

<Bestellverwaltung>

Das folgende öffnende und schließende Element stellt einen Zeilenumbruch dar. Für das maschinelle Lesen benötigen wir diesen nicht, aber da wir das resultierende XML-Dokument auch für Menschen leicht lesbar machen wollen, können Zeilenumbrüche nicht schaden:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!