2017-09-29 84 views
0

例如,我有一个以下结构的XML文件:XML转换多个CSV使用XSLT

<?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> 

我知道肯定有永远只有一个MainItem在XML文件中。同时,一个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类来执行转换。

+2

如果您使用Saxon 9或XmlPrime或Altova等XSLT 2.0处理器,则可以使用'xsl:result-document'通过一次转换创建多个结果文档。如果您使用XSLT 1.0处理器,则需要检查它是否支持扩展元素以创建多个结果文档。 –

+2

我不知道支持XslCompiledTransform来创建几个带有一个转换的结果文档,只是尝试使用扩展对象或脚本将创建委托给.NET代码。在这种情况下,编写两个单独的XSLT样式表然后使用XSLT之外的.NET代码分别运行两个样式表来创建两个CSV文件可能会更容易。但使用.NET,您可以选择切换到Saxon 9(HE版本是开源的,可在NuGet上使用)或XmlPrime或Altova,以切换到XSLT 2.0或3.0。 –

+0

感谢您的评论,我将使用XSLT 2.0和Saxon HE。 – floyd

回答

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); 
} 

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