2017-04-01 165 views
0

我有一個很大的XML文件,我拼命嘗試將它轉換爲一個帶有xsltproc的CSV文件。使用帶有複雜文件的xsltproc將XML轉換爲CSV

我想提取的所有數據可以在[GRP alias="TRIUT" level="5"]下找到。

我需要的僅僅是這些文件的標籤:從 「Rubrique」 的ELEMENT_1

  • Matricule
  • 名稱
  • mount1的價值這是我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> 
    

    什麼我想看到的是:

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

    你認爲這是可能的嗎?

    這就是我試圖做的,但它沒有在所有我所需要的答案...

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

    這是我得到的,但不是我想要的東西......

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

    感謝那些想要絞盡腦汁的人!

+0

你應該發佈你所嘗試過的,因爲即使它可能不工作,它實際上表明你已經嘗試了一些東西。而且你永遠不知道,你的XSLT可能不會太離譜。謝謝! –

+0

嗨@TimC我剛剛做到了,但是離我的期望很遠...... – Peter

回答

2

你應該選擇GRP具有匹配的開始屬性

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

然後,您可以有一個模板匹配GRP它輸出你需要的領域。例如,輸出「Matricule」,它看起來像這樣

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

輸出Rubrique「的ELEMENT_1 976‘’從mount1的價值」是一個比較複雜一點,因爲很多條件都參與:

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

試試這個XSLT

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

編輯:由 「Matricule」 進行排序,改變xsl:apply-templates有一個xsl:sort聲明,就像這樣:

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

我不知道該說什麼...... 當我看到「回答4分鐘前」時,它讓我發瘋...... 非常感謝您的回答,幾乎爲您詳細解釋! – Peter

+0

要求的另一個改進... 模板內部是否有方法通過Matricule直接對文件進行排序? – Peter

+0

我已經對我的答案進行了編輯,以顯示排序如何工作。 –