XLST将XML转换为CSV

时间:2017-03-25 12:18:29

标签: xml csv

我有以下.XML,我试图转换为CSV。我遇到的问题是重复的“批处理作业”标记一直出现在输出中,当我需要的只是批处理内容的列表时。所以我想要的输出是:

GX2320,GX2023,GX2218等。

任何指示赞赏。

由于

<?xml version="1.0" encoding="utf-8"?>
<data>
 <batch job="1">
    <index id="batch">GX2320</index>
  </batch>
  <batch job="2">
    <index id="batch">GX2023</index>
  </batch>
  <batch job="3">
    <index id="batch">GX2218</index>
  </batch>
  <batch job="4">
    <index id="batch">GX2635</index>
  </batch>
  <batch job="5">
    <index id="batch">GX2532</index>
  </batch>
  <batch job="6">
    <index id="batch">MR12358</index>
  </batch>
  <batch job="7">
    <index id="batch">GM1387</index>
  </batch>
  <batch job="8">
    <index id="batch">GM1769</index>
  </batch>
  <batch job="9">
    <index id="batch">GN6605</index>
  </batch>
  <batch job="10">
    <index id="batch">GW1435</index>
  </batch>
  <batch job="11">
    <index id="batch">GX2120</index>
  </batch>
  <batch job="12">
    <index id="batch">GX2054</index>
  </batch>
  <batch job="13">
    <index id="batch">GR42348</index>
  </batch>
  <batch job="14">
    <index id="batch">GE26813</index>
  </batch>
  <batch job="15">
    <index id="batch">GR36258</index>
  </batch>

到目前为止,我一直试图让以下操作,但只获得空白文件输出,好像它无法找到每个子语句:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="iso-8859-1"/>
  <xsl:strip-space elements="*" />
  <xsl:template match="/*/*/child::*">
   <xsl:for-each select="child::*">
      <xsl:if test="position() > 1">
        <xsl:text>,</xsl:text>
      </xsl:if>
      <xsl:value-of select="normalize-space(.)"/>
    </xsl:for-each>
    <xsl:text>&#xD;</xsl:text>
  </xsl:template>
 </xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

你的模板匹配太深了。 match="/*/*/child::*"的上下文将是index。该元素没有任何子元素,因此xsl:for-each永远不会选择任何内容。

让我们说它确实选择了index。然后,position()测试永远不会有效,因为index始终位于第一个位置。

您应该匹配batch并输出index ...

的值
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="iso-8859-1"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*/batch">
    <xsl:if test="position() > 1">
      <xsl:text>,</xsl:text>
    </xsl:if>
    <xsl:value-of select="normalize-space(index)"/>
    <xsl:text>&#xD;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

注意:如果需要,您可以将batchindex名称替换为*