Hallo,
ich bin gerade dabei eine XML in eine CSV-Liste Umzuwandeln. Meine Test XML hat folgende Struktur:
<POIliste>
<POI Sprache="DEU">
<Name>Frühstück</Name>
<Preis></Preis>
<Nr>1</Nr>
<Typ>p</Typ>
</POI>
<POI>
<Name>Mittagspause</Name>
<Preis>1</Preis>
<Nr>2</Nr>
<Typ>p</Typ>
</POI>
</POIliste>
Der CSV Header soll verschiedene Attribute und auch Elemente beinhalten. Hierführ habe ich eine Kombination aus einer Element- und Attributorientierten XSLT entworfen. Diese sieht zur Zeit so aus:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="Trenner" select="';'"/>
<xsl:param name="Feld" select="''"/>
<xsl:param name="Spaltenkoepfe" select="'TRUE'"/>
<xsl:template match="/">
<xsl:if test="$Spaltenkoepfe = 'TRUE'">
<!--Spaltenköpfe -->
<xsl:for-each select="/*/*[1]/child::* | /*/*[1]/@*">
<!-- Feldauszeichnung links -->
<xsl:call-template name="Feldauszeichnung"/>
<xsl:value-of select="local-name(.)"/>
<!-- Feldauszeichnung rechts -->
<xsl:call-template name="Feldauszeichnung"/>
<!--Trenner -->
<xsl:if test="not(position()=last())">
<xsl:value-of select="$Trenner"/>
</xsl:if>
</xsl:for-each>
xsl:text
</xsl:text>
</xsl:if>
<!--Datenausgabe -->
<xsl:for-each select="/*/*">
<xsl:for-each select="child::* | @*">
<!-- Feldauszeichnung links -->
<xsl:call-template name="Feldauszeichnung"/>
<xsl:value-of select="."/>
<!-- Feldauszeichnung rechts -->
<xsl:call-template name="Feldauszeichnung"/>
<!--Trenner -->
<xsl:if test="not(position()=last())">
<xsl:value-of select="$Trenner"/>
</xsl:if>
</xsl:for-each>
xsl:text
</xsl:text>
</xsl:for-each>
</xsl:template>
<!-- Feldauszeichnung -->
<xsl:template name="Feldauszeichnung">
<xsl:if test="$Feld != ''">
<xsl:value-of select="$Feld"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Als Ergebnis kommt nun folgendes heraus:
Sprache;Name;Preis;Nr;Typ
DEU;Frühstück;;1;p
Mittagspause;1;2;p
Das Problem ist nun, dass wenn das Element <POI> kein Attribut hat, nichts in der CSV Werteliste erscheint. In diesem Beispiel rutscht nun der Wert "Mittagspause" in die Zeile "Sprache".
Wie stricke ich mir nun eine Abfrage, die mir das ganze also richtig ausgibt:
Sprache;Name;Preis;Nr;Typ
DEU;Frühstück;;1;p
;Mittagspause;1;2;p
Vielen Dank schonmal für eure Hilfe!
Grüße,
Michael