Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

XSL Transformation

Frage Entwicklung HTML

Mitglied: it-frosch

it-frosch (Level 2) - Jetzt verbinden

06.08.2009, aktualisiert 19:47 Uhr, 3508 Aufrufe, 4 Kommentare

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:

01.
<satz> 
02.
<nr>1</nr> 
03.
<wert1>eins</wert1> 
04.
<wert2>eins</wert2> 
05.
<wert3>eins</wert3> 
06.
<wert4>eins</wert4> 
07.
<wert5>eins</wert5> 
08.
<wert6>eins</wert6> 
09.
<betrag>40</betrag> 
10.
</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.
Mitglied: nxclass
07.08.2009 um 08:18 Uhr
evtl. so:

01.
<xsl:choose> 
02.
  <xsl:when test="string-length(//SATZ/WERT1) &gt; 0"> 
03.
     <xsl:value-of select="//SATZ/WERT1" /> 
04.
  </xsl:when> 
05.
  <xsl:otherwise> 
06.
    <xsl:text>NULL</xsl:text> 
07.
  </xsl:otherwise> 
08.
</xsl:choose>
oder man arbeitet mit den templates:
01.
<xsl:template match="//SATZ/WERT1"> 
02.
  <xsl:value-of select="//SATZ/WERT1" /> 
03.
</xsl:template> 
04.
 
05.
<xsl:apply-templates select="//SATZ/WERT1" />
Bitte warten ..
Mitglied: it-frosch
10.08.2009 um 17:10 Uhr
Hallo nxclass,

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

01.
<xsl:stylesheet version=\"1.0\" 
02.
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"> 
03.
<xsl:output method=\"text\" encoding=\"iso-8859-1\"/> 
04.
 
05.
<xsl:strip-space elements=\"*\" /> 
06.
 
07.
<xsl:template match=\"/SATZ/child::*\"> 
08.
<xsl:for-each select=\"child::*\"> 
09.
 
10.
<xsl:choose> 
11.
  <xsl:when test=\"string-length(NR) &gt; 0\">  
12.
    <xsl:value-of select=\"NR\" />  
13.
  </xsl:when>  
14.
   <xsl:otherwise> 
15.
    <xsl:text>NULL</xsl:text> 
16.
  </xsl:otherwise> 
17.
</xsl:choose> 
18.
 
19.
<xsl:choose> 
20.
  <xsl:when test=\"string-length(WERT1) &gt; 0\">  
21.
    <xsl:value-of select=\"WERT1\" />  
22.
  </xsl:when>  
23.
   <xsl:otherwise> 
24.
    <xsl:text>NULL</xsl:text> 
25.
  </xsl:otherwise> 
26.
</xsl:choose> 
27.
 
28.
<xsl:choose> 
29.
<xsl:when test=\"string-length(WERT2) &gt; 0\">  
30.
    <xsl:value-of select=\"WERT2\" />  
31.
  </xsl:when>  
32.
   <xsl:otherwise> 
33.
    <xsl:text>NULL</xsl:text> 
34.
  </xsl:otherwise> 
35.
</xsl:choose> 
36.
 
37.
<xsl:choose> 
38.
<xsl:when test=\"string-length(WERT3) &gt; 0\">  
39.
    <xsl:value-of select=\"WERT3\" />  
40.
  </xsl:when>  
41.
   <xsl:otherwise> 
42.
    <xsl:text>NULL</xsl:text> 
43.
  </xsl:otherwise> 
44.
</xsl:choose> 
45.
 
46.
<xsl:choose> 
47.
<xsl:when test=\"string-length(WERT4) &gt; 0\">  
48.
    <xsl:value-of select=\"WERT4l\" />  
49.
  </xsl:when>  
50.
   <xsl:otherwise> 
51.
    <xsl:text>NULL</xsl:text> 
52.
  </xsl:otherwise> 
53.
</xsl:choose> 
54.
 
55.
<xsl:choose> 
56.
<xsl:when test=\"string-length(WERT5) &gt; 0\">  
57.
    <xsl:value-of select=\"WERT5\" />  
58.
  </xsl:when>  
59.
   <xsl:otherwise> 
60.
    <xsl:text>NULL</xsl:text> 
61.
  </xsl:otherwise> 
62.
</xsl:choose> 
63.
 
64.
<xsl:choose> 
65.
<xsl:when test=\"string-length(WERT5) &gt; 0\">  
66.
    <xsl:value-of select=\"WERT5\" />  
67.
  </xsl:when>  
68.
   <xsl:otherwise> 
69.
    <xsl:text>NULL</xsl:text> 
70.
  </xsl:otherwise> 
71.
</xsl:choose> 
72.
 
73.
 
74.
<xsl:if test=\"position() != last()\">\"<xsl:value-of select=\"normalize-space(.)\"/>\",</xsl:if> 
75.
<xsl:if test=\"position()  = last()\">\"<xsl:value-of select=\"normalize-space(.)\"/>\"<xsl:text>&#xD;</xsl:text> 
76.
</xsl:if> 
77.
</xsl:for-each> 
78.
</xsl:template> 
79.
 
80.
</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?
Bitte warten ..
Mitglied: nxclass
10.08.2009 um 20:41 Uhr
XML:
01.
<file> 
02.
<satz> 
03.
<nr>1</nr> 
04.
<wert1>eins</wert1> 
05.
<wert2>zwei</wert2> 
06.
<wert3>drei</wert3> 
07.
<betrag>40</betrag> 
08.
</satz> 
09.
<satz> 
10.
<nr>1</nr> 
11.
<wert1>eins</wert1> 
12.
<wert3>drei</wert3> 
13.
<betrag>40</betrag> 
14.
</satz> 
15.
</file>
XSL:
01.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
02.
    <xsl:output method="text" encoding="iso-8859-1"/> 
03.
 
04.
    <xsl:template match="nr"> 
05.
        <xsl:value-of select="." /><xsl:text>, </xsl:text> 
06.
    </xsl:template> 
07.
 
08.
    <xsl:template match="wert1"> 
09.
        <xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text> 
10.
    </xsl:template> 
11.
     
12.
    <xsl:template match="wert2"> 
13.
        <xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text> 
14.
    </xsl:template> 
15.
     
16.
    <xsl:template match="wert3"> 
17.
        <xsl:text>'</xsl:text><xsl:value-of select="." /><xsl:text>', </xsl:text> 
18.
    </xsl:template> 
19.
    <!-- usw --> 
20.
 
21.
    <xsl:template match="betrag"> 
22.
        <xsl:value-of select="." /> 
23.
    </xsl:template> 
24.
     
25.
     
26.
    <!-- ROOT Template --> 
27.
     
28.
    <xsl:template match="satz"> 
29.
        <xsl:apply-templates select="nr" /> 
30.
         
31.
        <xsl:choose> 
32.
            <xsl:when test="wert1"> <xsl:apply-templates select="wert1" /> </xsl:when> 
33.
            <xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise> 
34.
        </xsl:choose> 
35.
        <xsl:choose> 
36.
            <xsl:when test="wert2"> <xsl:apply-templates select="wert2" /> </xsl:when> 
37.
            <xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise> 
38.
        </xsl:choose> 
39.
        <xsl:choose> 
40.
            <xsl:when test="wert3"> <xsl:apply-templates select="wert3" /> </xsl:when> 
41.
            <xsl:otherwise> <xsl:text>NULL, </xsl:text> </xsl:otherwise> 
42.
        </xsl:choose> 
43.
        <!-- usw --> 
44.
 
45.
        <xsl:apply-templates select="betrag" /> 
46.
        <xsl:text>&#xD;</xsl:text> 
47.
    </xsl:template> 
48.
 
49.
</xsl:stylesheet>
habe das mal schnell in PHP gebaut..
01.
// ... 
02.
$oXslt = new XSLTProcessor(); 
03.
$oXslt->registerPHPFunctions(); 
04.
$oXslt->importStyleSheet( DOMDocument::loadXML( $sXSL ) ); 
05.
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.
Bitte warten ..
Mitglied: it-frosch
11.08.2009 um 10:04 Uhr
Hallo nxclass,

vielen Dank.
Hat super geklappt. Ich habe über XML einiges dazugelernt.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...