На основе мой предыдущий вопрос.
Мы изменили структуру 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>
Что мне следует изменить? У вас есть лучший подход?