2015-03-31 99 views
0

我需要將xml文件轉換爲csv文件。因此我使用msxsl。該XML文件是這樣的:通過xsl(msxsl)轉換xml

(...) 
<Test> 
    <Field1>Blabla</Field1> 
    <Values> 
    <Year>2012</Year> 
    <Value>12</Value> 
    </Values> 
    <Values> 
    <Year>2013</Year> 
    <Value>1234</Value> 
    </Values> 
    <Field2>abc</Field2> 
</Test> 

<Test> 
    <Field1>Blubblub</Field1> 
    <Field2>def</Field2> 
</Test> 
(...) 

這意味着:有數據集的「測試」有幾個節點「值」,和其他人沒有任何。

我試着用的for-each來解決這個:

(...) 
<xsl:for-each select="Test"> 
(...) 
<xsl:for-each select="Values"> 
(...) 
</xsl:for-each> 
</xsl:for-each> 
(...) 

這工作(的方式),但柱的側向承載力數量不會在數據集之間的匹配。我需要在每個數據集中爲整個文件中的每個節點設置最大數量的列。

最後一個應該可以用excel打開csv文件。因此,每列需要包含相同的數據......有沒有辦法做到這一點?

謝謝!

編輯:在這種情況下,預期的CSV輸出應該是這樣的:

Blabla;2012;12;2013;1234;abc 
Blubblub;;;;;def 

...而不是:

Blabla;2012;12;2013;1234;abc 
Blubblub;def 
+0

如果我們能夠看到轉換示例的預期輸出,那麼這可能會更清晰。 – 2015-03-31 19:40:50

+0

excel將打開一個xml文件,可能仍然需要一個轉換,但它可能不那麼痛苦。 – 2015-03-31 19:44:21

+0

我已經添加了預期的csv輸出。 Excel無法打開這些XML文件。我們不知道,爲什麼 - 使用msxsl是替代解決方案... – Forangar 2015-03-31 20:14:58

回答

0

鑑於你預期的CSV輸出(實際上SSV,分號似乎是分離值),我認爲你根本不需要內部的for-each。我會做更多的沿線:

<xsl:for-each select="Test"> 
    <xsl:value-of select="Field1"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[1]/Year"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[1]/Value"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[2]/Year"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[2]/Value"/> 
    <xsl:text>;</xsl:text> 

    <!-- etc, up to the final... --> 

    <xsl:value-of select="Field2"/> 
</xsl:for-each> 

這給你一個固定數量的字段,其中沒有節點存在的空值。

+0

您假設已知「」中的''元素的最大數量並且可以進行硬編碼。 – 2015-03-31 20:55:43

+0

是的,我是,因爲他需要在恆定的CSV列中有「Field2」,並且只有在提前知道最大值時纔會發生。 – bjimba 2015-03-31 22:08:26

+0

我的猜測是「Field2」需要是** last **列 - 對於所有轉換後的文檔而言不一定是恆定的。但是這是OP的澄清。 – 2015-03-31 22:56:49