通过xsl进行xml转换(msxsl)

时间:2015-03-31 19:32:22

标签: xml xslt msxsl

我需要将xml文件转换为csv文件。因此我正在使用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

1 个答案:

答案 0 :(得分: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>

这为您提供了固定数量的字段,其中没有节点存在的空值。