使用带有复杂文件的xsltproc将XML转换为CSV

时间:2017-04-01 08:45:37

标签: xml csv xslt

我有一个很大的XML文件,我拼命试图将其转换为xsltproc的CSV文件。

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

我需要的只是文件的这些标签:

  • Matricule
  • 姓名
  • 来自ELEMENT_1的“Rubrique”976的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;

感谢那些想要绞尽脑汁的人!

1 个答案:

答案 0 :(得分:2)

您应该从选择具有匹配属性的GRP

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

然后,您可以使用匹配GRP的模板输出您需要的字段。例如,要输出“Matricule”,它看起来像这样

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

从ELEMENT_1的“Rubrique”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>