看到您的评论后,您想为所有条目组提供相同的信息,@gid
我必须编写一个与我以前的解决方案截然不同的解决方案,它值得一个新的答案。
不幸的是,以这种方式分组并不是 XSL 中最简单的部分,但它就是这样。请注意,使用所谓的 Muenchian 方法可以提高效率,但我以这种方式编写它是为了(相对)简单性和可读性。(我看到Sean B. Durkin使用了更快的方法,因此您可以比较它们。)
它的工作方式是xsl:for-each
循环遍历<entry>
具有gid
与所有先前元素不同的属性的所有<entry>
元素。这会选择gid
属性的所有唯一值,这些值会复制到$gid
变量中。
之后,将<target_value>
元素内<entry>
具有相同gid
属性的所有元素收集到一个节点集中并分配给变量$target_values
。之后很容易计算它们并找到它们的总数,将它们除以另一个以获得平均值,然后将其分配给另一个变量。
然后只输出gid
每个不同的属性值和平均值gid
。该$nl
变量是一个方便变量,等于用于布局输出的换行符。
我希望很容易从这里推断出您需要的最终解决方案。如果你卡住了,请再次询问。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:variable name="nl">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/root">
<xsl:for-each select="entry[not(@gid = preceding-sibling::entry/@gid)]">
<xsl:sort select="@gid" />
<xsl:variable name="gid" select="@gid" />
<xsl:variable name="target_values" select="/root/entry[@gid=$gid]/level_1/target_value" />
<xsl:variable name="mean_target_values" select="sum($target_values) div count($target_values)" />
<xsl:value-of select="concat('GID: ', $gid, $nl)" />
<xsl:value-of select="concat('mean target value ', format-number($mean_target_values, '0.00'), $nl)" />
<xsl:value-of select="$nl" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
产生这个输出
GID: 001
mean target value 40.00
GID: 002
mean target value 60.33
GID: 003
mean target value 27.00
应用于此 XML 时
<?xml version="1.0" encoding="UTF-8"?>
<root>
<entry gid ="001">
<level_1>
<target_value>50</target_value>
</level_1>
</entry>
<entry gid ="001">
<level_1>
<target_value>30</target_value>
</level_1>
</entry>
<entry gid ="002">
<level_1>
<target_value>40</target_value>
</level_1>
</entry>
<entry gid ="002">
<level_1>
<target_value>72</target_value>
</level_1>
</entry>
<entry gid ="002">
<level_1>
<target_value>69</target_value>
</level_1>
</entry>
<entry gid ="003">
<level_1>
<target_value>14</target_value>
</level_1>
</entry>
<entry gid ="003">
<level_1>
<target_value>44</target_value>
</level_1>
</entry>
<entry gid ="003">
<level_1>
<target_value>23</target_value>
</level_1>
</entry>
</root>