【发布时间】:2015-10-29 11:38:31
【问题描述】:
我们对 XML 结构进行了更改,因此输入现在如下所示:
<EXPORT>
<DOCUMENTS>
<DOCUMENT>
<INDEX NAME="NAME" VALUE="folder"/>
<INDEX NAME="LOCATION" VALUE="C:\here"/>
</DOCUMENT>
<DOCUMENT>
<INDEX NAME="COLOR" VALUE="blue"/>
<INDEX NAME="LOCATION" VALUE="C:\here"/>
<INDEX NAME="DATE" VALUE="01-25-2015"/>
</DOCUMENT>
</DOCUMENTS>
</EXPORT>
对于这个例子,我想得到以下 CSV 输出:
NAME,LOCATION,COLOR,DATE
folder, c:\here,,
,C:\here,blue,01-25-2015
我痛苦地尝试了很多东西,但我不知道generate-id 是如何工作的。我最终得到了这个完全不起作用的 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="fields" match="/EXPORT/DOCUMENTS/*" use="./@name"/>
<xsl:variable name="Fields"
select="/EXPORT/DOCUMENTS/*[generate-id()=generate-id(key('fields', local-name())[1])]" />
<xsl:template match="/">
<xsl:for-each select="$Fields">
<xsl:value-of select="local-name()" />
<xsl:if test="position() < last()">
<xsl:value-of select="$delimiter" />
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:apply-templates select="*/*" />
</xsl:template>
<xsl:template match="*">
<xsl:variable name="this" select="." />
<xsl:for-each select="$Fields">
<xsl:value-of select="$this/*[local-name() = local-name(current())]" />
<xsl:if test="position() < last()">
<xsl:value-of select="$delimiter" />
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我应该改变什么?你有更好的方法吗?
【问题讨论】: