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.
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:
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 122213
Url: https://administrator.de/forum/xsl-transformation-122213.html
Ausgedruckt am: 04.04.2025 um 08:04 Uhr
4 Kommentare
Neuester Kommentar
evtl. so:
oder man arbeitet mit den templates:
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<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:
1
2
3
4
5
2
3
4
5
<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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<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..
1
2
3
4
5
2
3
4
5
// ...
$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.