ich 有以下 XML:
<item>
<number>1</number>
<value>2</value>
</item>
<item>
<number>2</number>
<value>22</value>
</item>
<item>
<number>1</number>
<value>4</value>
</item>
我想用 xslt 1.0 将 xml 转换为:
<item>
<number>1</number>
<value>6</value>
</item>
<item>
<number>2</number>
<value>22</value>
</item>
必须将同一项目编号的值相加,最后我想合并同一项目的元素。可以有 n 个具有相同编号的多个项目。在此示例中,编号为 1 的项目在 xml 中出现了两次,因此这两次将成为一个条目,并且值 (2,4) 将添加到 6。
最佳答案
这是一个非常基本的分组问题。在 XSLT 1.0 中,分组是通过使用 the Muenchian method 完成的。 .
以 identity transform 开头...
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
将所有 item
分组作者:number
通过创建 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
元素。然后创建一个新的value
元素总和 item
与该键匹配...
<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>
关于xml - XSLT 合并多个条目并将数字相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47721368/