我有很多这样的文件:
<?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经验,我有点迷路了,我知道我就在那里,但看不到它…
我想你要:
<?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>
</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>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
您可以使用以下命令:
<?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
</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>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>