同じエントリのすべてのグループにこの情報を提供したいというコメントを見て@gid
、以前のソリューションとは非常に異なるソリューションを作成する必要があるため、新しい回答に値します。
残念ながら、この方法でのグループ化は XSL の最も単純な部分ではありませんが、ここにあります。Muenchian 法として知られている方法を使用してより効率的にすることができることに注意してください。( Sean B. Durkinはより高速な方法を使用しているようですので、それらを比較してください。)
これが機能する方法は、先行するすべての要素とは異なる属性を持つxsl:for-each
すべての要素をループすることです。これにより、属性の一意の値がすべて選択され、変数にコピーされます。<entry>
gid
<entry>
gid
$gid
その後、同じ属性を持つ<target_value>
要素内のすべての要素が nodeset に集められ、 variable に割り当てられます。その後、それらを数えて合計を求め、一方を他方で割って平均を取得し、それを別の変数に代入するのは簡単です。<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>