这是一个非常基本的分组问题。在 XSLT 1.0 中,分组是通过使用 the Muenchian method 来完成的。
以identity transform开头...
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
通过使用number 创建一个匹配item 的xsl:key,将所有item 分组number...
<xsl:key name="items" match="item" use="number"/>
从所有item 的父级上下文(以doc 为例),输出元素的副本并将模板应用于组中的第一个item(以及任何属性)。 ..
<xsl:template match="doc">
<xsl:copy>
<xsl:apply-templates select="@*|item[count(.|key('items',number)[1])=1]"/>
</xsl:copy>
</xsl:template>
添加与item 匹配的模板并输出它的副本。将模板应用于任何属性和number 元素。然后使用与该键匹配的所有item 的总和创建一个新的value 元素...
<xsl:template match="item">
<xsl:copy>
<xsl:apply-templates select="@*|number"/>
<value><xsl:value-of select="sum(key('items',number)/value)"/></value>
</xsl:copy>
</xsl:template>
完整示例...
XML 输入(添加了单个根元素 doc 以使输入格式正确)
<doc>
<item>
<number>1</number>
<value>2</value>
</item>
<item>
<number>2</number>
<value>22</value>
</item>
<item>
<number>1</number>
<value>4</value>
</item>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="items" match="item" use="number"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="doc">
<xsl:copy>
<xsl:apply-templates select="@*|item[count(.|key('items',number)[1])=1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item">
<xsl:copy>
<xsl:apply-templates select="@*|number"/>
<value><xsl:value-of select="sum(key('items',number)/value)"/></value>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML 输出
<doc>
<item>
<number>1</number>
<value>6</value>
</item>
<item>
<number>2</number>
<value>22</value>
</item>
</doc>