我正在尝试将XML转换为CSV,其中每个条目都不包含所有值。列顺序必须保留。
初始文件:
<?xml version='1.0' encoding='UTF-8'?>
<data>
<entry>
<a>FR</a>
<b>Dupont</b>
<c>123456</c>
<d>zzz</d>
<f>New York</f>
</entry>
<entry>
<a>FR</a>
<b>Martin</b>
<c>234561</c>
<d>xxx</d>
<e>2019-01-01</e>
<f>Paris</f>
</entry>
<entry>
<a>FR</a>
<b>Chris</b>
<c>345612</c>
<d>yyy</d>
<e>2019-01-01</e>
</entry>
</data>
预期输出:
a;b;c;d;e;f
FR;Dupont;123456;zzz;;New York
FR;Martin;234561;xxx;2019-01-01;Paris
FR;Chris;345612;yyy;2019-01-01;
我正在努力以正确的顺序获取标头值。我尝试了distinct-values()和for-each-group(),但是我无法保留顺序。
我尝试过的一个例子:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#all">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="distinct-values(//entry/*/local-name())">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出:
abcdfe
有什么想法吗?谢谢。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="#all">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="distinct-values(//entry/*/local-name())">
<xsl:value-of select="concat(.,';')"/>
</xsl:for-each>
<xsl:for-each select="//entry">
<xsl:text>
</xsl:text>
<xsl:for-each select="*">
<xsl:value-of select="concat(.,';')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>