1

我是 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 内部创建这样的东西吗?

任何帮助是极大的赞赏!!提前谢谢你。

4

2 回答 2

0

一般来说,你想要这样的东西:

<?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”,那么一个真实的例子会很有帮助。

于 2013-05-23T17:51:25.597 回答
0
<?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>

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

于 2013-05-23T19:16:45.713 回答