XSL Transformation
Hallo,
Ich möchte eine XML Datei in eine CSV Datei umwandeln. Die Elemente eines XML Datensatz soll durch Komma getrennt in einer Zeile stehen.
Das ist prinzipiell klar.
Allerdings haben enthält nicht jeder XML Datensatz alle Elemente.
So sieht ein vollständiger Datensatz aus:
In manchen Datensätzen fehlen jedoch ein oder mehrere "wert" Elemente.
Diese fehlenden Elemente möchte ich jetzt mit einem Platzhalter z.B. "Leer" in der CSV Datei ersetzen damit die Anzahl der Spalten stimmt.
Mit xsl:if und xsl:choose habe ich schon experimentiert aber mir fehlt irgendwie so etwas wie xsl:if exist ...... else .
Ich hoffe mein Problem ist klar geworden. Es wäre schön wenn mir jemand einen Tipp geben könnte.
Danke schon mal.
So sieht ein vollständiger Datensatz aus:
<satz>
<nr>1</nr>
<wert1>eins</wert1>
<wert2>eins</wert2>
<wert3>eins</wert3>
<wert4>eins</wert4>
<wert5>eins</wert5>
<wert6>eins</wert6>
<betrag>40</betrag>
</satz>
In manchen Datensätzen fehlen jedoch ein oder mehrere "wert" Elemente.
Diese fehlenden Elemente möchte ich jetzt mit einem Platzhalter z.B. "Leer" in der CSV Datei ersetzen damit die Anzahl der Spalten stimmt.
Mit xsl:if und xsl:choose habe ich schon experimentiert aber mir fehlt irgendwie so etwas wie xsl:if exist ...... else .
Ich hoffe mein Problem ist klar geworden. Es wäre schön wenn mir jemand einen Tipp geben könnte.
Danke schon mal.
Please also mark the comments that contributed to the solution of the article
Content-Key: 122213
Url: https://administrator.de/contentid/122213
Printed on: April 20, 2024 at 06:04 o'clock
4 Comments
Latest comment
evtl. so:
oder man arbeitet mit den templates:
<xsl:choose>
<xsl:when test="string-length(//SATZ/WERT1) > 0">
<xsl:value-of select="//SATZ/WERT1" />
</xsl:when>
<xsl:otherwise>
<xsl:text>NULL</xsl:text>
</xsl:otherwise>
</xsl:choose>
oder man arbeitet mit den templates:
<xsl:template match="//SATZ/WERT1">
<xsl:value-of select="//SATZ/WERT1" />
</xsl:template>
<xsl:apply-templates select="//SATZ/WERT1" />
XML:
XSL:
habe das mal schnell in PHP gebaut..
...geht soweit - nur sollte man auch noch die Daten prüfen damit das auch ein valides CSV File wird.
<file>
<satz>
<nr>1</nr>
<wert1>eins</wert1>
<wert2>zwei</wert2>
<wert3>drei</wert3>
<betrag>40</betrag>
</satz>
<satz>
<nr>1</nr>
<wert1>eins</wert1>
<wert3>drei</wert3>
<betrag>40</betrag>
</satz>
</file>
XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:template match="nr">
<xsl:value-of select="." /><xsl:text>, </xsl:text>
</xsl:template>
<xsl:template match="wert1">
<xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text>
</xsl:template>
<xsl:template match="wert2">
<xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text>
</xsl:template>
<xsl:template match="wert3">
<xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text>
</xsl:template>
<!-- usw -->
<xsl:template match="betrag">
<xsl:value-of select="." />
</xsl:template>
<!-- ROOT Template -->
<xsl:template match="satz">
<xsl:apply-templates select="nr" />
<xsl:choose>
<xsl:when test="wert1"> <xsl:apply-templates select="wert1" /> </xsl:when>
<xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="wert2"> <xsl:apply-templates select="wert2" /> </xsl:when>
<xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="wert3"> <xsl:apply-templates select="wert3" /> </xsl:when>
<xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise>
</xsl:choose>
<!-- usw -->
<xsl:apply-templates select="betrag" />
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
habe das mal schnell in PHP gebaut..
// ...
$oXslt = new XSLTProcessor();
$oXslt->registerPHPFunctions();
$oXslt->importStyleSheet( DOMDocument::loadXML( $sXSL ) );
echo $oXslt->transformToXML( DOMDocument::loadXML( $sXML ) );
...geht soweit - nur sollte man auch noch die Daten prüfen damit das auch ein valides CSV File wird.