【问题标题】:xml transformation via xsl (msxsl)通过 xsl (msxsl) 进行 xml 转换
【发布时间】:2015-06-05 06:50:01
【问题描述】:

我需要将 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

【问题讨论】:

  • 如果我们可以看到转换示例的预期输出,这可能会更清楚。
  • excel 将打开一个 xml 文件,可能仍需要转换,但它可能不那么痛苦。
  • 我已经添加了预期的 csv 输出。 Excel 无法打开这些 xml 文件。我们不知道,为什么 - 使用 msxsl 是替代解决方案...
  • 可以假设每个&lt;Values&gt; 元素都包含两个值吗?并且在每个 &lt;Test&gt; 元素中重复这两个“字段”?
  • 是的,每个 元素都包含相同的两个值,并且这两个字段在每个 元素中都重复。此外,我们知道, 元素中出现 0 到 10 次。

标签: xml xslt msxsl


【解决方案1】:

鉴于您预期的 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>

这为您提供了固定数量的字段,在不存在节点的情况下为空值。

【讨论】:

  • 您假设&lt;Test&gt;&lt;Values&gt; 元素的最大数量是已知的并且可以硬编码。
  • 是的,我是,因为他需要在一个恒定的 CSV 列中包含“Field2”,并且只有在提前知道最大值的情况下才会发生这种情况。
  • 我的猜测是“Field2”需要是 last 列 - 对于所有转换后的文档不一定是恒定的。但这需要 OP 来澄清。
  • 其实我们知道最多可以出现10次。所以这将是解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2013-02-05
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多