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"/>
假设我有以下节点:
<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"/>