XLST将XML转换为CSV

XLST将XML转换为CSV,xml,csv,Xml,Csv,我正在尝试将下面的.XML转换为CSV。我遇到的问题是输出中不断出现重复的“批处理作业”标记,而我所需要的只是批处理内容的列表。所以我想要得到的结果是: GX2320、GX2023、GX2218等 欢迎指点 谢谢 <?xml version="1.0" encoding="utf-8"?> <data> <batch job="1"> <index id="batch">GX2320</index> </batch&

我正在尝试将下面的.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>

GX2320
GX2023
GX2218
GX2635
GX2532
MR12358
GM1387
GM1769
GN6605
GW1435
GX2120
GX2054
GR42348
GE26813
GR36258
到目前为止,我们一直在尝试使以下语句可操作,但只获得空白文件输出,就好像找不到每个子语句一样:

 <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>

,

;

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

假设它确实选择了
索引
。然后您的
position()
测试将永远无法工作,因为
索引始终位于第一个位置

您应该匹配
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>

,

;

注意:如果需要,您可以将
批处理
索引
名称替换为
*

我一直在尝试读取每个子语句,然后每次转发输出都为空:见上文。谢谢大牛,是的,效果很好,谢谢你的投入!