1

我在这个论坛上搜索了很多,以避免发布问题。

我的输入 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>

我想输出这样的数据:

段1-数据1

段1-数据2

段2-数据3

段2-数据4

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

4

2 回答 2

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>
于 2013-08-02T13:32:26.397 回答
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>
于 2013-08-02T13:26:00.370 回答