私はCSVに変換したいXML出力をいくつか持っていますが、キーと値のペアを含むデータでは最も難しいと判明しています。私は何日も何度も反復を試みましたが、ついには助けが必要です。これは、XSLT 1.0で変換する必要があるXMLです。キーと値のペアを持つCSVへのXSLT
<?xml version="1.0" encoding="UTF-8"?>
<status>
<snapshot>
<metrics>
<entry>
<key>time</key>
<value>1001</value>
</entry>
<entry>
<key>bytes</key>
<value>104</value>
</entry>
<entry>
<key>input</key>
<value>13321</value>
</entry>
<entry>
<key>output</key>
<value>11002</value>
</entry>
</metrics>
<timestamp>2016-01-12T01:00</timestamp>
<metrics>
<entry>
<key>time</key>
<value>1002</value>
</entry>
<entry>
<key>bytes</key>
<value>105</value>
</entry>
<entry>
<key>input</key>
<value>13322</value>
</entry>
<entry>
<key>output</key>
<value>11003</value>
</entry>
</metrics>
<timestamp>2016-01-12T02:00</timestamp>
</snapshot>
</status>
私は、出力は次のようになりたいと思います:
time,bytes,input,output,timestamp
1001,104,13321,11002,2016-01-12T01:00
1002,105,13322,11003,2016-01-12T02:00
===私が使用していますXSLTを追加する===
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="delimiter" select="','"/>
<xsl:key name="field" match="entry/*" use="name()"/>
<xsl:template match="/">
<xsl:for-each select="/*/*/*/*/*[generate-id()=generate-id(key('field', name())[1])]">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:for-each select="/*/sObject">
<xsl:variable name="property" select="." />
<xsl:for-each select="$property/*">
<xsl:variable name="value" select="." />
<xsl:value-of select="$value"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
サイドノート...私は@dnovatchevからXSLTコードの一部を適応しようとしたが、私は、キーと値のペアのシナリオにそれを適応の問題を抱えています。 –
すべての 'metrics'が同じエントリーを同じ順序で持つと仮定できますか? 、異なる値でのみ? –
@shellter私が作業しているコードを追加する。 –