使用XSLT将xml转换为CSV

时间:2011-08-16 12:03:13

标签: xml xslt csv

我是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将是导入系统的最终输出

任何可以向前迈进的起步帮助都将非常感激

1 个答案:

答案 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>&#10;</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>&#10;</xsl:text>
        </xsl:when>
        <xsl:otherwise>;</xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>