XSLT 1.0使用xsl:for-each转换结果覆盖 如何实现属性分组求和
问题根源
你用<xsl:for-each>做累加出现值覆盖,是因为用了过程式语言的循环赋值思路写XSLT:XSLT 1.0的变量属于不可变值,定义后无法重新赋值,循环内定义的同名变量仅在当前循环分支作用域生效,根本无法实现跨循环的累加逻辑。
最简实现
不需要写循环遍历,直接用XPath 1.0原生的sum()条件聚合即可,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/Test"> <Test> <xsl:attribute name="value1Sum"> <xsl:value-of select="sum(Tests/Tests1[@name='value1']/@value)"/> </xsl:attribute> <xsl:attribute name="value2Sum"> <xsl:value-of select="sum(Tests/Tests1[@name='value2']/@value)"/> </xsl:attribute> </Test> </xsl:template> </xsl:stylesheet>
逻辑说明
- 路径表达式
Tests/Tests1[@name='value1']会自动匹配所有符合name属性条件的Tests1节点,无需手动写for-each遍历 sum()函数会直接对选中节点集的value属性做数值求和,完全规避变量作用域、值覆盖的问题- 转换后输出结果和预期完全一致:
<Test value1Sum="40" value2Sum="60"></Test>
内容的提问来源于stack exchange,提问作者Sree
相关产品推荐
相关产品推荐

