xml到csv使用xsl

时间:2018-01-12 08:17:28

标签: xml csv xslt

我想使用xsl将xml以下转换为csv。我的挑战是我必须从不同的根源和顺序获取元素

<root>
    <child1>
        <value1>100</value1>
    </child1>
    <child1>
            <value1>200</value1>
    </child1>
    <child2>
        <value2>300</value2>
    </child2>
    <child2>
         <value2>400</value2>
    </child2>
</root>

预期输出为:

child1,child2
100,300
200,400

有谁知道我们如何使用xslt实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以使用以下XSLT获取所需的输出

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

    <xsl:template match="root">
        <xsl:variable name="countChild1" select="count(child1)" />
        <xsl:variable name="countChild2" select="count(child2)" />
        <xsl:variable name="column1" select="local-name(child1)" />
        <xsl:variable name="column2" select="local-name(child2)" />

        <!-- Print header row -->
        <xsl:value-of select="$column1" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="$column2" />
        <xsl:text>&#xD;</xsl:text>

        <!-- Print values -->
        <xsl:if test="$countChild1 = $countChild2">
            <xsl:for-each select="child1">
                <xsl:variable name="index" select="position()" />
                <xsl:value-of select="normalize-space(.)" />
                <xsl:text>,</xsl:text>
                <xsl:value-of select="normalize-space(../child2[$index])" />
                <xsl:text>&#xD;</xsl:text>
            </xsl:for-each>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

输出

child1,child2
100,300
200,400