XSLT:聚合父节点中的子节点数据

XSLT: Aggregate child nodes data in parent

假设我有以下节点:

<parent>
  <child size="1" />
  <child size="2" />
  <child size="3" />
</parent>

我想在输出文档中得到的是子尺寸的平均值、最小值和最大值。即

<parent min-size="1" max-size="3" avg-size="2" />

是否可以使用带有 EXSLT 扩展的 XSLT 1.0?

下面是一个使用 math:max() and math:min()...

的例子

XSLT 1.0 (stylesheet.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:math="http://exslt.org/math"
  extension-element-prefixes="math">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="parent">
    <parent min-size="{math:min(child/@size)}" 
      max-size="{math:max(child/@size)}" 
      avg-size="{sum(child/@size) div count(child/@size)}"/>
  </xsl:template>

</xsl:stylesheet>

Python

from lxml import etree

tree = etree.parse("input.xml")
xslt = etree.parse("stylesheet.xsl")

new_tree = tree.xslt(xslt)

print(etree.tostring(new_tree, pretty_print=True).decode("utf-8"))

输出

<parent min-size="1" max-size="3" avg-size="2"/>