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

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: nxclass
nxclass 07.08.2009 um 08:18:12 Uhr
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" />  
Mitglied: it-frosch
it-frosch 10.08.2009 um 17:10:48 Uhr
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?
Mitglied: nxclass
nxclass 10.08.2009 um 20:41:23 Uhr
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.
Mitglied: it-frosch
it-frosch 11.08.2009 um 10:04:41 Uhr
Goto Top
Hallo nxclass,

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