XSLT递归输出

时间:2013-08-02 11:44:13

标签: xslt

我一直在这个论坛上搜索,以避免发布问题。

我的输入XML看起来像这样:


<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>

我想输出这样的数据:

SEGMENT1-DATA1

SEGMENT1-DATA2

分段2-DATA3

分段2-DATA4

我尝试使用递归XSLT,但似乎按预期工作。 关于我怎么能得到这个的任何想法? 谢谢!

2 个答案:

答案 0 :(得分:0)

对于XSLT 2.0分组来说,这是一个非常简单的问题,因为在group-starting-with =中会进行匹配。

t:\ftemp>type segments.xml
<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>
t:\ftemp>xslt2 segments.xml segments.xsl
segment1-data1
segment1-data2
segment2-data3
segment2-data4

t:\ftemp>type segments.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

<xsl:output method="text"/>

<xsl:template match="table">
  <xsl:for-each-group select="tag" group-starting-with="tag[@id='segment']">
    <xsl:variable name="prefix" select="data"/>
    <xsl:for-each select="current-group()[position()>1]">
      <xsl:value-of select="concat($prefix,'-',data)"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>

答案 1 :(得分:0)

如果您遇到XSLT 1.0,那么这就是您的答案...请注意,递归不是必需的,您只需要从树中找到您想要的项目:

t:\ftemp>type segments.xml
<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>
t:\ftemp>xslt segments.xml segments1.xsl
segment1-data1
segment1-data2
segment2-data3
segment2-data4

t:\ftemp>type segments1.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="text"/>

<xsl:template match="table">
  <xsl:for-each select="tag[@id='segment']">
    <xsl:variable name="prefix" select="data"/>
    <xsl:for-each select="following-sibling::tag[@id='data']
                       [generate-id(preceding-sibling::tag[@id='segment'][1])=
                        generate-id(current())]">
      <xsl:value-of select="concat($prefix,'-',data)"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>