使用 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> </xsl:text>
<xsl:for-each select="MainItem">
<xsl:value-of select="Field1"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="Field2"/>
<xsl:text> </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的主要内容,如果未能解决你的问题,请参考以下文章