使用 XSL 转换将 XML 转换为 CSV

发布于 2024-12-16 19:20:22 字数 1008 浏览 0 评论 0原文

我有一个 XML 数据,我需要使用 xsl 转换将其转换为 CSV。但问题是,XML根节点(指A、B、C节点)各不相同。请参阅下文:

XML data
--------
<Sheets>
<A>
<Data>
<Row>
<value1>2</value1>
<value2>4</value2>
</Row>
<Row>
<value1>5</value1>
<value2>6</value2>
</Row>   
</Data>
</A>
<B>
<Data>
<Row>
<value1>12</value1>
<value2>13</value2>
</Row>
<Row>
<value1>14</value1>
<value2>15</value2>
</Row>
</Data>
</B>
<C>
<Data>
<Row>
<value1>1</value1>
<value2>1</value2>
</Row>
<Row>
<value1>2</value1>
<value2>2</value2>
</Row>
</Data>
</C>
</Sheets>    
    CSV output should like this:
    ----------------------------
    A, 2, 4
    A, 5, 6
    B, 12, 13
    B, 14, 15
    C, 1, 1
    C, 2, 2

请帮助我。

提前致谢。

I have a XML data and I need to convert the same to CSV using xsl transformation. But the problem is, the XML rootnodes (refer to A, B, C nodes) varies. Please see below:

XML data
--------
<Sheets>
<A>
<Data>
<Row>
<value1>2</value1>
<value2>4</value2>
</Row>
<Row>
<value1>5</value1>
<value2>6</value2>
</Row>   
</Data>
</A>
<B>
<Data>
<Row>
<value1>12</value1>
<value2>13</value2>
</Row>
<Row>
<value1>14</value1>
<value2>15</value2>
</Row>
</Data>
</B>
<C>
<Data>
<Row>
<value1>1</value1>
<value2>1</value2>
</Row>
<Row>
<value1>2</value1>
<value2>2</value2>
</Row>
</Data>
</C>
</Sheets>    
    CSV output should like this:
    ----------------------------
    A, 2, 4
    A, 5, 6
    B, 12, 13
    B, 14, 15
    C, 1, 1
    C, 2, 2

Please help me.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

羁绊已千年 2024-12-23 19:20:22
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="no" method="text" />

    <xsl:template match="/Sheets">
        <xsl:for-each select="*">
            <xsl:variable name="dataSet" select="name()" />
            <xsl:for-each select="Data/Row">
                <xsl:value-of select="$dataSet" />
                <xsl:text>, </xsl:text>
                <xsl:for-each select="*">
                    <xsl:value-of select="text()" />
                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="no" method="text" />

    <xsl:template match="/Sheets">
        <xsl:for-each select="*">
            <xsl:variable name="dataSet" select="name()" />
            <xsl:for-each select="Data/Row">
                <xsl:value-of select="$dataSet" />
                <xsl:text>, </xsl:text>
                <xsl:for-each select="*">
                    <xsl:value-of select="text()" />
                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
半岛未凉 2024-12-23 19:20:22

这应该输出你想要的文本:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Sheets">
<!-- This will match the letters -->
<xsl:for-each select="*">
<xsl:for-each select="*/descendant::Row">
<xsl:text>
</xsl:text>
<!-- Name of grand parent (two levels up) which is the letter -->
<xsl:value-of select="local-name(../..)"/><xsl:for-each select="*">, <xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

This should output the text you want:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Sheets">
<!-- This will match the letters -->
<xsl:for-each select="*">
<xsl:for-each select="*/descendant::Row">
<xsl:text>
</xsl:text>
<!-- Name of grand parent (two levels up) which is the letter -->
<xsl:value-of select="local-name(../..)"/><xsl:for-each select="*">, <xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文