xml到csv转换值增量

时间:2015-10-27 20:22:23

标签: xml csv xslt

我想将xml文件转换为csv(上面的结构)并计算低节点数,我尝试使用

 <xsl:value-of select="position()"/>

和数字,但我总是得到1231212我想得到的是1234567

<root>
    <row>
        <low id="1d" name="bio">FNO</low>
        <low id="1d" name="bbn">NBN</low>
         <low id="1d" name="afs">CAA</low>
    </row>
    <row>
        <low id="1a" name="adn">VHH</low>
        <low id="1d" name="bio">ADN</low>
    </row>
<row>
        <low id="1r" name="rio">BOA</low>
        <low id="1f" name="flo">KGG</low>
    </row>
</root>
有人可以帮忙吗?谢谢

所需的输出:

 row  low  id name
  row1 low1  1d bio
  row1 low2  1c bbn
  row1 low3  1d afs
  row2 low4  1a adn
....

使用了xsl

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

  <xsl:template match="/root">
    <xsl:apply-templates select="row/low"/>
  </xsl:template>

  <xsl:template match="low">
    <xsl:value-of select="concat(position(),',',.,'&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

尝试使用xsl:number

示例...

XML输入

<root>
    <row>
        <low>FNO</low>
        <low>NBN</low>
        <low>CAA</low>
    </row>
    <row>
        <low>VHH</low>
        <low>ADN</low>
    </row>
    <row>
        <low>BOA</low>
        <low>KGG</low>
    </row>
</root>

XSLT 1.0

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

  <xsl:template match="low">
    <xsl:number level="any"/>
    <xsl:value-of select="concat(',',.,'&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

1,FNO
2,NBN
3,CAA
4,VHH
5,ADN
6,BOA
7,KGG

或者,如果您更改正在处理的节点集,position()将起作用。在下面的示例中,正在处理的唯一节点是low,因此position()可以工作(产生与上面相同的输出)....

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

  <xsl:template match="/root">
    <xsl:apply-templates select="row/low"/>
  </xsl:template>

  <xsl:template match="low">
    <xsl:value-of select="concat(position(),',',.,'&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

如果您在输出位置之前必须对low进行排序等操作,这将派上用场。 (您只需将<xsl:sort/>添加到xsl:apply-templates。)

修改

这是使用更新的输入和所需输出的另一个示例。此输出与所需输出略有不同,因为它以逗号分隔。用您想要的任何分隔符替换逗号。

XML输入

<root>
    <row>
        <low id="1d" name="bio">FNO</low>
        <low id="1d" name="bbn">NBN</low>
        <low id="1d" name="afs">CAA</low>
    </row>
    <row>
        <low id="1a" name="adn">VHH</low>
        <low id="1d" name="bio">ADN</low>
    </row>
    <row>
        <low id="1r" name="rio">BOA</low>
        <low id="1f" name="flo">KGG</low>
    </row>
</root>

XSLT 1.0

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

  <xsl:template match="/root">
    <xsl:text>row,low,id,name&#xA;</xsl:text>    
    <xsl:apply-templates select="row/low"/>
  </xsl:template>

  <xsl:template match="low">
    <xsl:text>row</xsl:text>
    <xsl:number count="row"/>
    <xsl:value-of select="concat(',low',position(),',',@id,',',@name,'&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

row,low,id,name
row1,low1,1d,bio
row1,low2,1d,bbn
row1,low3,1d,afs
row2,low4,1a,adn
row2,low5,1d,bio
row3,low6,1r,rio
row3,low7,1f,flo