使用 XSLT 将 XML 转换为多个 CSV

Posted

技术标签:

【中文标题】使用 XSLT 将 XML 转换为多个 CSV【英文标题】:Transform XML into multiple CSV using XSLT 【发布时间】:2018-03-11 06:20:40 【问题描述】:

例如,我有一个具有以下结构的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<MainItem>
    <Field1>1</Field1>
    <Field2>2</Field2>  
    <SubItem>
        <SubField1>1</SubField1>
        <SubField2>2</SubField2>
    </SubItem>
    <SubItem>
        <SubField1>3</SubField1>
        <SubField2>4</SubField2>
    </SubItem>
</MainItem>

我确信在 XML 文件中总是只有一个 MainItem。同时,一个MainItem 可能有多个SubItem 元素。 我希望能够使用 XSLT 将此 XML 转换为 CSV。下面是我当前的 XSLT 脚本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">    
<xsl:text>Field1,Field2</xsl:text>
<xsl:text>&#10;</xsl:text>  
<xsl:for-each select="MainItem">
    <xsl:value-of select="Field1"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="Field2"/>     
    <xsl:text>&#10;</xsl:text> 
</xsl:for-each>

此 XSLT 将 XML 转换为以下 CSV:

Field1,Field2
1,2

问题是如何使用 XSLT 将上述 XML 转换为 2 个 CSV 文件 - 第一个用于MainItem 元素,第二个用于SubItem

我正在使用 .NET XslCompiledTransform 类来执行转换。

【问题讨论】:

如果您使用像 Saxon 9 或 XmlPrime 或 Altova 这样的 XSLT 2.0 处理器,您可以使用 xsl:result-document 通过一次转换创建多个结果文档。如果您使用 XSLT 1.0 处理器,您需要检查它是否支持扩展元素来创建多个结果文档。 我不知道是否支持 XslCompiledTransform 通过一个转换创建多个结果文档,而不是尝试使用扩展对象或脚本将创建委托给 .NET 代码。在这种情况下,编写两个单独的 XSLT 样式表然后使用 XSLT 之外的 .NET 代码分别运行两个样式表以创建两个 CSV 文件可能更容易。但是,使用 .NET,您可以选择通过切换到 Saxon 9(HE 版本是开源的,在 NuGet 上可用)或 XmlPrime 或 Altova 来迁移到 XSLT 2.0 或 3.0。 感谢您的评论,我将在 Saxon HE 中使用 XSLT 2.0。 【参考方案1】:

使用Cinchoo ETL 库(一个开源 ETL 框架)可以做到这一点

using (var reader = new ChoXmlReader("test.xml").WithXPath("MainItem")
    .WithField('Field1')
    .WithField('Field2')
)

    using (var writer = new ChoCSVWriter("test.csv"))
        writer.Write(reader);

免责声明:我是这个库的作者。

【讨论】:

以上是关于使用 XSLT 将 XML 转换为多个 CSV的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 将 CSV 文件转换为 XML

使用 XSLT 将 XML 转换为 CSV

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

使用 XSLT 将 XML 转换为 CSV

使用 XSLT 格式问题将 XML 转换为 CSV

使用XSLT将XML转换为csv