我有一个很大的XML文件,我拼命试图将其转换为xsltproc
的CSV文件。
我想提取的所有数据都可以在[GRP alias="TRIUT" level="5"]
下找到。
我需要的只是文件的这些标签:
这是我的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>&#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>&#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 :(得分: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 </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> </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>