我是XSLT的新手,并且经历了一些早期的SO线程 Thread i Followed
我的要求类似,我需要将XML转换为CSV,例如我有以下XML
<?xml version="1.0" encoding="UTF-8"?>
<impex>
<record>
<Employee/>
<UID>aa</UID>
<Name>HR Manager</Name>
<Groups/>
<Password>123456</Password>
</record>
<record>
<Employee/>
<UID>bb</UID>
<Name>HR Executive</Name>
<Groups/>
<Password>123456</Password>
</record>
</impex>
我需要将此XML转换为以下csv输出
INSERT_UPDATE Employee;UID[unique=true];name;groups(uid);password
;"aa";"HR Manager";;"123456"
;"bb";"HR Executive";;"123456"
我必须动态管理csv标头(基于xml元素)
additonaly我还要注意,如果缺少某些值,我可以提供它们 例如 在这种情况下,我需要为生成的csv提供一些默认值,因为这个csv将是导入系统的最终输出
任何可以向前迈进的起步帮助都将非常感激
答案 0 :(得分:2)
不是最美丽的,但它有效
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/impex">
<xsl:text>INSERT_UPDATE </xsl:text>
<xsl:apply-templates select="record[1]/*" mode="header"/>
<xsl:apply-templates select="record" />
</xsl:template>
<xsl:template match="*" mode="header" >
<xsl:value-of select="name()"/>
<xsl:choose>
<xsl:when test="position()=last()">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>;</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="record">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*" >
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position()=last()">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>;</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>