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)" />
我试图让 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)" />