it-frosch
Goto Top

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:

<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.

Content-Key: 122213

Url: https://administrator.de/contentid/122213

Printed on: April 20, 2024 at 06:04 o'clock

Member: nxclass
nxclass Aug 07, 2009 at 06:18:12 (UTC)
Goto Top
evtl. so:

<xsl:choose>
  <xsl:when test="string-length(//SATZ/WERT1) &gt; 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" />  
Member: it-frosch
it-frosch Aug 10, 2009 at 15:10:48 (UTC)
Goto Top
Hallo nxclass,

vielen Dank für deine Antwort. Leider komme ich auch nach einigen Stunden rumprobieren nicht weiter.

<xsl:stylesheet version=\"1.0\"  
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">  
<xsl:output method=\"text\" encoding=\"iso-8859-1\"/>  

<xsl:strip-space elements=\"*\" />  

<xsl:template match=\"/SATZ/child::*\">  
<xsl:for-each select=\"child::*\">  

<xsl:choose>
  <xsl:when test=\"string-length(NR) &gt; 0\">   
    <xsl:value-of select=\"NR\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
  <xsl:when test=\"string-length(WERT1) &gt; 0\">   
    <xsl:value-of select=\"WERT1\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
<xsl:when test=\"string-length(WERT2) &gt; 0\">   
    <xsl:value-of select=\"WERT2\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
<xsl:when test=\"string-length(WERT3) &gt; 0\">   
    <xsl:value-of select=\"WERT3\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
<xsl:when test=\"string-length(WERT4) &gt; 0\">   
    <xsl:value-of select=\"WERT4l\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
<xsl:when test=\"string-length(WERT5) &gt; 0\">   
    <xsl:value-of select=\"WERT5\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>

<xsl:choose>
<xsl:when test=\"string-length(WERT5) &gt; 0\">   
    <xsl:value-of select=\"WERT5\" />   
  </xsl:when> 
   <xsl:otherwise>
    <xsl:text>NULL</xsl:text>
  </xsl:otherwise>
</xsl:choose>


<xsl:if test=\"position() != last()\">\"<xsl:value-of select=\"normalize-space(.)\"/>\",</xsl:if>  
<xsl:if test=\"position()  = last()\">\"<xsl:value-of select=\"normalize-space(.)\"/>\"<xsl:text>&#xD;</xsl:text>  
</xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>


Aber das funktioniert so gar nicht. Es werden weder Trennzeichen gesetzt noch sind die fehlenden Element mit NULL gekennzeichnet. Hast du noch einen Tipp was ich falsch mache?
Member: nxclass
nxclass Aug 10, 2009 at 18:41:23 (UTC)
Goto Top
XML:
<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>&#xD;</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.
Member: it-frosch
it-frosch Aug 11, 2009 at 08:04:41 (UTC)
Goto Top
Hallo nxclass,

vielen Dank.
Hat super geklappt. Ich habe über XML einiges dazugelernt.