使用XSLT将XML转换为CSV [英] XML to CSV using XSLT

查看:223
本文介绍了使用XSLT将XML转换为CSV的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XML IS:

<projects>
    <project>
        <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
        <language>Ruby</language> 
        <Manager ID="M1">Nathan</Manager>
    </project>
    <project>
        <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
        <language>Erlang</language>
        <Manager ID="M2">Kristi</Manager>  
    </project>
</projects>

我想使用XSLT将此XML复制到CSV。有1000个这样的项目。
我如何得到下面的输出到csv:

I want to copy this XML to CSV using XSLT. There are 1000 such projects. How can I get the output Shown below into a csv:

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi|   


推荐答案

它将在元素的文本之前输出任何属性。

Try something like this instead. It will output any attributes before the text of the element.

XML输入

<projects>
    <project>
        <name ID="A">Shockwave</name> 
        <language>Ruby</language> 
    </project>
    <project>
        <name ID="B">Other</name> 
        <language>Erlang</language>  
    </project>
</projects>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project">
        <xsl:apply-templates select="@*|node()"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:value-of select="."/>
        <xsl:if test="../text() or parent::project">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[ancestor::project]">
        <xsl:apply-templates select="@*"/>
        <xsl:if test="preceding-sibling::*">
            <xsl:text>,</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

输出

A,Shockwave,Ruby
B,Other,Erlang


$ b b

编辑新的要求

XML输入

<projects>
    <project>
        <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
        <language>Ruby</language> 
        <Manager ID="M1">Nathan</Manager>
    </project>
    <project>
        <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
        <language>Erlang</language>
        <Manager ID="M2">Kristi</Manager>  
    </project>
</projects>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project">
        <xsl:apply-templates select="@*|node()"/>
        <xsl:text>|</xsl:text>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:if test="count(parent::*/@*)=1 and not(parent::project)">
            <xsl:text>;</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
        <xsl:if test="parent::project or (last())">
            <xsl:text>;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[ancestor::project]">
        <xsl:apply-templates select="@*"/>
        <xsl:if test="preceding-sibling::* and not(@*)">
            <xsl:text>;</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

输出

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi|

这篇关于使用XSLT将XML转换为CSV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆