使用xsltproc将XML转换为CSV

时间:2014-05-06 11:36:49

标签: xml xslt csv xslt-1.0

我有很多文件是这样的:

<?xml version="1.0" encoding="utf-8"?>
<DATA>
  <TP ID="1P3">
    <VALUES><DATETIME>2014-04-30T10:14:00Z</DATETIME><EE>4.820</EE><STATUS>0</STATUS></VALUES>
    <VALUES><DATETIME>2014-04-30T10:29:00Z</DATETIME><EE>4.825</EE><STATUS>0</STATUS></VALUES>
    <VALUES><DATETIME>2014-04-30T10:44:00Z</DATETIME><EE>4.831</EE><STATUS>0</STATUS></VALUES>
  </TP>
  <TP ID="4P2">
    <VALUES><DATETIME>2014-04-30T10:14:02Z</DATETIME><EE>556.006</EE><STATUS>0</STATUS></VALUES>
    <VALUES><DATETIME>2014-04-30T10:29:01Z</DATETIME><EE>556.550</EE><STATUS>0</STATUS></VALUES>
    <VALUES><DATETIME>2014-04-30T10:44:01Z</DATETIME><EE>557.097</EE><STATUS>0</STATUS></VALUES>
  </TP>
  <ID>WSE_KA-CCE</ID>
  <SN>140252702523</SN>
  <IP>37.80.230.61</IP>
</DATA>

我需要将它们转换为CSV,因此我创建了一个XSL模板,但无法使其按预期工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
  <xsl:template match="/">
    <xsl:text>Zählernummer,Zeitstempel,Zählerstand
    </xsl:text>
    <xsl:for-each select="//TP">
        <xsl:value-of select="@ID"/>,
    </xsl:for-each>
    <xsl:for-each select="//TP/VALUES">
        <xsl:value-of select="DATETIME"/>,<xsl:value-of select="EE"/><xsl:text>
        </xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

我想看到的是:

Zählernummer,Zeitstempel,Zählerstand
1P3,2014-04-30T10:14:00Z,4.820
1P3,2014-04-30T10:29:00Z,4.825
1P3,2014-04-30T10:44:00Z,4.831
4P2,2014-04-30T10:14:02Z,556.006
4P2,2014-04-30T10:29:01Z,556.550
4P2,2014-04-30T10:44:01Z,557.097

但我得到的是:

212$ xsltproc data_XML2CSV.xml data-3.xml
Zählernummer,Zeitstempel,Zählerstand
    1P3,
    4P2,
    2014-04-30T10:14:00Z,4.820
        2014-04-30T10:29:00Z,4.825
        2014-04-30T10:44:00Z,4.831
        2014-04-30T10:14:02Z,556.006
        2014-04-30T10:29:01Z,556.550
        2014-04-30T10:44:01Z,557.097

这是我的第一次XSL体验,我有点迷失,我知道我差不多了,但看不到它......

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <xsl:text>Zählernummer,Zeitstempel,Zählerstand&#x0A;</xsl:text>
    <xsl:for-each select="//TP">
        <xsl:for-each select="VALUES">
            <xsl:value-of select="../@ID"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="DATETIME"/>,<xsl:value-of select="EE"/>
            <xsl:text>&#x0A;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>

</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

我想你想要:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:text>Zählernummer,Zeitstempel,Zählerstand</xsl:text>
        <xsl:text>&#xA;</xsl:text>
        <xsl:for-each select="DATA/TP/VALUES">
            <xsl:value-of select="../@ID"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="DATETIME"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="EE"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>