2017-09-29 127 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); 
} 

免責聲明:我這個庫的作者。