XSLT: агрегировать данные дочерних узлов в родительском - PullRequest
0 голосов
/ 17 октября 2018

Предположим, у меня есть следующий узел:

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

В выходном документе я хотел бы получить средние, минимальные и максимальные значения дочерних размеров.Т.е.

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

Можно ли использовать XSLT 1.0 с расширениями EXSLT?

1 Ответ

0 голосов
/ 17 октября 2018

Вот пример использования math: max () и math: min () ...

XSLT 1.0 (таблица стилей).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"/>
...