2017-04-01 3 views
0

Ich habe eine große XML-Datei, die ich verzweifelt versuchen, es in eine CSV-Datei mit xsltproc zu konvertieren.Konvertieren von XML in CSV mit xsltproc mit komplizierter Datei

Alle Daten, die ich extrahieren möchte, finden Sie unter [GRP alias="TRIUT" level="5"].

Was ich brauche, sind nur diese Tags der Datei:

  • Häftlings
  • Namen
  • Wert von mount1 aus dem "Rubrique" 976 des ELEMENT_1

Das ist mein ist XML:

<?xml version="1.0" encoding="UTF-8"?> 
<RPT> 
    <GRP alias="Reglementation" level="1"> 
     <FLD id="Reglementation">USA</FLD> 
     <GRP alias="RUPT1" level="2"> 
     <FLD id="RUPT1" /> 
     <GRP alias="RUPT2" level="3"> 
      <FLD id="RUPT2" /> 
      <GRP alias="RUPT3" level="4"> 
       <FLD id="RUPT3" /> 
       <GRP alias="TRIUT" level="5"> 
        <FLD id="TRIUT">00-532</FLD> 
        <DTL> 
        <FLD id="DateEdition" type="DATE">2017-02-01</FLD> 
        <FLD id="Name">MR CHARLIE CHAPLIN</FLD> 
        <FLD id="Matricule">12345678</FLD> 
        <SRPT id="ELEMENT_1"> 
         <DTL> 
          <FLD id="Rubrique">038</FLD> 
          <FLD id="Mount1" type="FLOAT">2200.95</FLD> 
          <FLD id="Mount2" type="FLOAT">00000.00</FLD> 
         </DTL> 
         <DTL> 
          <FLD id="Rubrique">976</FLD> 
          <FLD id="Mount1">9926.96</FLD> 
          <FLD id="Mount2">00000.00</FLD> 
         </DTL> 
        </SRPT> 
        </DTL> 
       </GRP> 
       <GRP alias="TRIUT" level="5"> 
        <FLD id="TRIUT">00186</FLD> 
        <DTL> 
        <FLD id="DateEdition">2017-03-31</FLD> 
        <FLD id="Nom">MR JAMES BOND</FLD> 
        <FLD id="Matricule">00000007</FLD> 
        <SRPT id="ELEMENT_1"> 
         <DTL> 
          <FLD id="Rubrique">038</FLD> 
          <FLD id="Mount1">2054.22</FLD> 
          <FLD id="Mount2">000000.00</FLD> 
         </DTL> 
         <DTL> 
          <FLD id="Rubrique">976</FLD> 
          <FLD id="Mount1">2054.22</FLD> 
          <FLD id="Mount2">00000.22</FLD> 
         </DTL> 
        </SRPT> 
        </DTL> 
       </GRP> 
      </GRP> 
     </GRP> 
     </GRP> 
    </GRP> 
</RPT> 

Was? Ich möchte sehen ist:

Matricule;Name;Rubrique976_Mount1 
12345678;MR CHARLIE CHAPLIN;9926.96 
00000007;MR JAMES BOND;2054.22 

Denken Sie, dass es möglich ist?

Das ist, was ich tun wollte, aber es tut überhaupt zu beantworten, was ich brauche ...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="/"> 
     <xsl:text>Matricule;Name;Rubrique976_Mount1</xsl:text> 
     <xsl:text>&amp;#xA;</xsl:text> 
     <xsl:for-each select="RPT/GRP/GRP/GRP/GRP/GRP/DTL"> 
     <xsl:for-each select="FLD"> 
      <xsl:value-of select="@id" /> 
      <xsl:text>;</xsl:text> 
      <xsl:value-of select="." /> 
      <xsl:text>;</xsl:text> 
      <xsl:for-each select="SRPT"> 
       <xsl:value-of select="@id" /> 
       <xsl:text>;</xsl:text> 
       <xsl:value-of select="." /> 
       <xsl:text>;</xsl:text> 
      </xsl:for-each> 
     </xsl:for-each> 
     <xsl:text>&amp;#xA;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Dies ist, was ich bekommen, aber nicht, was ich wollte ...

Matricule;Name;Rubrique976_Mount1 
DateEdition;2017-02-01;Name;MR CHARLIE CHAPLIN;Matricule;12345678; 
DateEdition;2017-03-31;Nom;MR JAMES BOND;Matricule;00000007; 

Danke für Leute, die ihr Gehirn zerbrechen wollen!

+0

Sie sollten veröffentlichen, was Sie versucht haben, denn obwohl es möglicherweise nicht funktioniert, zeigt es tatsächlich, dass Sie etwas versucht haben. Und Sie wissen nie, dass Ihr XSLT nicht zu weit weg von dem ist, was erforderlich ist. Vielen Dank! –

+0

Hi @TimC Ich habe es gerade getan, aber sehr, sehr weit von dem, was ich erwarte ... – Peter

Antwort

2

Sie beginnen sollte GRP durch Auswahl, welche die passende Attribute

<xsl:apply-templates select="//GRP[@alias='TRIUT' and @level='5']" /> 

Sie dann eine Vorlage GRP passende haben kann, die die Felder gibt die Sie benötigen. Zum Beispiel zur Ausgabe des „Häftlinge“, es ist wie diese

<xsl:value-of select="DTL/FLD[@id='Matricule']" /> 

Ausgabe des „Wertes des mount1 aus dem‚Rubrique‘976 der ELEMENT_1“ aussehen würde, ist ein wenig komplizierter, weil eine Reihe von Bedingungen beteiligt ist, : diese XSLT

<xsl:value-of select="DTL 
         /SRPT[@id='ELEMENT_1'] 
         /DTL[FLD[@id='Rubrique']='976'] 
         /FLD[@id='Mount1']" /> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="/"> 
    <xsl:text>Matricule;Name;Rubrique976_Mount1&#10;</xsl:text> 
    <xsl:apply-templates select="//GRP[@alias='TRIUT' and @level='5']" /> 
    </xsl:template> 

    <xsl:template match="GRP"> 
    <xsl:value-of select="DTL/FLD[@id='Matricule']" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="DTL/FLD[@id='Name' or @id='Nom']" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="DTL/SRPT[@id='ELEMENT_1']/DTL[FLD[@id='Rubrique']='976']/FLD[@id='Mount1']" /> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

EDIT Versuchen: von "Häftlinge" zu sortieren, die xsl:apply-templates ändern, um eine xsl:sort Aussage zu haben, etwa so:

<xsl:apply-templates select="//GRP[@alias='TRIUT' and @level='5']"> 
    <xsl:sort select="DTL/FLD[@id='Matricule']" /> 
</xsl:apply-templates> 
+0

ich weiß nicht, was ich sagen soll ... wenn ich sehe "antwortete vor 4 Minuten", macht es mich verrückt ... Vielen Dank für Ihre Antwort und fast für Ihre ausführlichen Erläuterungen !!! – Peter

+0

Eine weitere Verbesserung zu fragen ... Gibt es einen Weg innerhalb der Vorlage, um die Datei direkt von Matricule zu sortieren? – Peter

+0

Ich habe meine Antwort bearbeitet, um zu zeigen, wie das Sortieren funktioniert. –

Verwandte Themen