【问题标题】:xml to csv transformation value incrementationxml 到 csv 转换值递增
【发布时间】:2015-10-27 20:22:22
【问题描述】:

我想将一个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>

【问题讨论】:

  • 请发布您的 XSLT 和预期的输出。

标签: xml csv xslt


【解决方案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 进行排序,这将派上用场。 (您只需将&lt;xsl:sort/&gt; 添加到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

【讨论】:

  • 谢谢你回答抱歉,但我忘了告诉我想显示低1,低2,低3 ..不仅仅是数字
  • @User04 - 这应该很容易;只需在xsl:numberposition() 之前添加文本。如果它不适合您,请使用您正在使用的 XSLT 和所需的输出更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多