我一直在这个论坛上搜索,以避免发布问题。
我的输入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,但似乎按预期工作。 关于我怎么能得到这个的任何想法? 谢谢!
答案 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>
</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>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
t:\ftemp>