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

时间:2015-02-24 08:00:15

标签: xslt xslt-2.0 xslt-grouping

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

如果我在一个项目下有多个具有相同区域的refdes,它只计算总和中的第一个但我想要全部计算。

输入:

<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>

1 个答案:

答案 0 :(得分:3)

问题是,对于area属性为&#34; area1&#34;的情况,只涉及两个price个节点。 sum函数不会多次对同一节点求和。 (将sum更改为count,您会看到它返回2)。

尝试将语句更改为此

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