C# 使用XSLT将XML转换为多个CSV

C# 使用XSLT将XML转换为多个CSV,c#,.net,xml,csv,xslt,C#,.net,Xml,Csv,Xslt,例如,我有一个具有以下结构的XML文件: <?xml version="1.0" encoding="utf-8"?> <MainItem> <Field1>1</Field1> <Field2>2</Field2> <SubItem> <SubField1>1</SubField1> <SubField2>2<

例如,我有一个具有以下结构的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>

此XSLT将XML转换为以下CSV:

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


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

这是使用开源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 2.0处理器,如Saxon 9或XmlPrime或Altova,则可以使用xsl:result-document通过一次转换创建多个结果文档。如果使用XSLT 1.0处理器,则需要检查它是否支持扩展元素来创建多个结果文档。我不知道是否支持XslCompiledTransform通过一次转换创建多个结果文档,而只是尝试使用扩展对象或脚本将创建委托给.NET代码。在这种情况下,编写两个单独的XSLT样式表,然后使用XSLT之外的.NET代码分别运行两个样式表来创建两个CSV文件可能更容易。但是,对于.NET,您可以通过切换到Saxon 9来选择XSLT 2.0或3.0。该版本是开源的,可以在NuGet、XmlPrime或Altova上获得。感谢您的评论,我将在Saxon HE上使用XSLT 2.0。
using (var reader = new ChoXmlReader("test.xml").WithXPath("MainItem")
    .WithField('Field1')
    .WithField('Field2')
)
{
    using (var writer = new ChoCSVWriter("test.csv"))
        writer.Write(reader);
}