XSLT XML to CSV

本文关键字:CSV to XML XSLT | 更新日期: 2023-09-27 18:15:08

我是XSLT的新手,真的希望有人能帮助我。我从我们的服务器得到一个XML文档,我需要能够将其转换为CSV文件。下面是一个XML文件的例子:

<root>
  <DataRow>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
  </DataRow>
  <DataRow>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
  </DataRow>
  <DataRow>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
    <ColumnName>Value</ColumnName>
  </DataRow>
</root>

我需要能够将XML转换为CSV,但我很难创建XSL模板文件,希望有人能帮助我。第一行应该是列名,第二行及之后的行应该是值。在XSLT中有可能创建这样的东西吗?

任何帮助都是非常感激的!

XSLT XML to CSV

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">    
        <xsl:for-each select="/root/DataRow[1]/*">
            <xsl:if test="position()!=1">
                <xsl:value-of select="','"/>
            </xsl:if>
            <xsl:value-of select="name()"/>
        </xsl:for-each>
        <xsl:value-of select="'&#xA;'"/>
        <xsl:for-each select="root/DataRow">
            <xsl:for-each select="*">
                <xsl:if test="position()!=1">
                    <xsl:value-of select="','"/>
                </xsl:if>
                <xsl:value-of select="."/>
            </xsl:for-each>
            <xsl:value-of select="'&#xA;'"/>
        </xsl:for-each>
    </xsl:template>
</xsl:transform>

试试这个样式表。它使用默认模板和值的嵌套循环

一般情况下,您需要这样做:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:template match="root/DataRow">
  <xsl:if test="position() = 2">
          <xsl:for-each select="*">
      <xsl:if test="position() != 1">
        <xsl:value-of select="','"/>
      </xsl:if>
      <xsl:value-of select="name()"/>
    </xsl:for-each>
    <xsl:value-of select="'&#xA;'"/>
  </xsl:if>
  <xsl:for-each select="*">
    <xsl:if test="position() != 1">
      <xsl:value-of select="','"/>
    </xsl:if>
    <xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:value-of select="'&#xA;'"/>
</xsl:template>

第一个模板是列标题行,列名需要在那里。如果我对它们了解得更多,就会自动确定。如果它们并不是真的都命名为"ColumnName",一个真实的例子会有很大帮助。