XSLT 2.0 for-each-group,基于父值的总和

XSLT 2.0 for-each-group, sum based on parent value

我试图让 for-each-group 在我的 xml 中工作但没有成功,我想在我的 refdes-tags 中对区域进行分组,然后计算每个区域的价格总和。

如果我在一个项目下有多个具有相同区域的引用,它只会计算总和中的第一个,但我希望所有的都被计算在内。

输入:

<part>
    <bom>
        <item partnumber="1">
            <refdes area="area1">010</refdes>
            <price>0.5</price>
        </item>
        <item partnumber="2">
            <refdes area="area2">020</refdes>
            <price>1.0</price>
        </item>
        <item partnumber="3">
            <refdes area="area1">030</refdes>
            <refdes area="area1">060</refdes>
            <refdes area="area2">070</refdes>
            <price>0.3</price>
        </item>
    </bom>
</part>

xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" /> 
    <xsl:template match="/">
        <table class="sortable" id="odd">
            <tr>
                <th>Area</th>
                <th>Price</th>
            </tr>
            <xsl:for-each-group select="part/bom/item/refdes" group-by="@area">
                <xsl:sort select="@area" data-type="text" order="ascending"/>
                <xsl:element name="tr">
                    <td>
                        <xsl:value-of select="current-grouping-key()" />
                    </td>
                    <td>
                        <xsl:value-of select="sum(current-group()/../price)" />
                    </td>
                </xsl:element>
            </xsl:for-each-group>
        </table>
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<table class="sortable" id="odd">
   <tr>
      <th>Area</th>
      <th>Price</th>
   </tr>
   <tr>
      <td>area1</td>
      <td>0.8</td>
   </tr>
   <tr>
      <td>area2</td>
      <td>1.3</td>
   </tr>
</table>

想要的输出:

<?xml version="1.0" encoding="UTF-8"?>
<table class="sortable" id="odd">
   <tr>
      <th>Area</th>
      <th>Price</th>
   </tr>
   <tr>
      <td>area1</td>
      <td>1.1</td>
   </tr>
   <tr>
      <td>area2</td>
      <td>1.3</td>
   </tr>
</table>

问题在于,对于area属性为"area1"的情况,只涉及两个price节点。 sum 函数不会多次对同一个节点求和。 (将 sum 更改为 count,您将看到 return 2)。

尝试将语句更改为此

<xsl:value-of select="sum(for $ref in current-group() return $ref/../price)" />