xslt 1.0 中计算节点平均值需用 sum() div count() 手动实现,配合 format-number() 控制精度,并用 xsl:choose 防除零;count() 统计节点数,sum() 求和(需确保内容可转数字)。

用 XSLT 计算 XML 节点总数和平均值,核心是用 sum() 和 count() 函数,再配合除法即可得到平均值。注意:XSLT 1.0 不支持 avg()(那是 XSLT 2.0+ 才有的),所以必须手动算 sum() div count()。
计算指定节点的总数(count)
用 count() 统计匹配到的节点个数。比如统计所有 <price></price> 元素的数量:
<xsl:value-of select="count(//price)" />
说明:
-
//price表示文档中任意位置的<price></price>元素; - 如果只统计某一层(如
book/price),就写具体路径,避免误统计; - 若没有匹配节点,
count()返回 0 —— 后续算平均值时需防除零错误。
计算数值节点的总和(sum)
sum() 对节点集里每个节点的字符串值转为数字后求和。要求节点内容可转为数字(如 "19.99" 可以,"free" 或空字符串会变成 NaN):
<xsl:value-of select="sum(//price)" />
常见处理技巧:
- 过滤掉非数字内容:用
number(.) != number(.)判 NaN(不推荐),更稳妥的是先用string(.) != '' and number(.) = number(.)筛有效数字; - 确保只取文本内容:写成
sum(//price/text())更明确(但多数情况//price已隐含取其字符串值); - 如果 price 带单位(如
<price>$25.50</price>),需用translate()或正则(XSLT 2.0+)预处理。
手动计算平均值(sum div count)
XSLT 1.0 中没有 avg(),所以平均值 = 总和 ÷ 个数。关键要避免除零:
<xsl:choose>
<xsl:when test="count(//price) > 0">
<xsl:value-of select="sum(//price) div count(//price)" />
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
说明:
-
div是 XSLT 中的除法运算符(不是/); - 结果默认保留小数,如需保留两位小数,XSLT 1.0 可用
format-number(sum(...) div count(...), '0.00'); - XSLT 2.0+ 可直接写
avg(//price),更简洁且自动跳过非数字节点。
完整示例:XML + XSLT 片段
假设 XML 有:
<catalog> <book><price>29.99</price></book> <book><price>15.50</price></book> <book><price>32.00</price></book> </catalog>
对应 XSLT 输出统计:
<xsl:template match="/"> 总数:<xsl:value-of select="count(//price)" /><br/> 总和:<xsl:value-of select="format-number(sum(//price), '0.00')" /><br/> 平均:<xsl:value-of select="format-number(sum(//price) div count(//price), '0.00')" /> </xsl:template>
输出效果:
总数:3总和:77.49
平均:25.83
基本上就这些。重点记牢:XSLT 1.0 用 sum() div count() 算平均,加 format-number() 控制精度,用 xsl:choose 防除零 —— 不复杂但容易忽略细节。










