如何使用基于级别1(外部),级别2(中间),级别3(内部)的xsl 2.0多重嵌套以下xml?
<rootNode>
<fruits>
<fruit>
<level1>4</level1>
<level2/>
<level3/>
<kind>orange</kind>
<size>big</size>
<origin>california</origin>
</fruit>
<fruit>
<level1>4</level1>
<level2>2</level2>
<level3/>
<kind>lemon</kind>
<size>small</size>
<origin>florida</origin>
</fruit>
<fruit>
<level1>4</level1>
<level2>2</level2>
<level3>1</level3>
<kind>pineapple</kind>
<size>normal</size>
<origin>oregon</origin>
</fruit>
<fruit>
<level1>5</level1>
<level2>2</level2>
<level3/>
<kind>pineapple</kind>
<size>normal</size>
<origin>oregon</origin>
</fruit>
<fruit>
<level1>5</level1>
<level2>1</level2>
<level3/>
<kind>peer</kind>
<size>big</size>
<origin>ohio</origin>
</fruit>
</fruits>
</rootNode>
我可以使用以下xslt在level1上完成
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/rootNode/fruits">
<xsl:for-each-group select="fruit" group-by="level1">
<level1 name="{current-grouping-key()}">
<xsl:copy-of select="current-group()"/>
</level1>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是,使用它的输出并再次对lavel2执行该操作不起作用。递归函数?怎么写?
答案 0 :(得分:0)
如标题所示,您需要嵌套两条xsl:for-each-group
指令,一条在另一条里面:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/rootNode">
<xsl:for-each-group select="fruits/fruit" group-by="level1">
<level1 name="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="level2">
<level2 name="{current-grouping-key()}">
<xsl:copy-of select="current-group()"/>
</level2>
</level1>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>