如何根据其他值添加值?
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item id="A1" quantity="5">
<info type="ram x1" import="CA" />
</item>
<item id="A2" quantity="3">
<info type="ram x1" import="SA" />
</item>
<item id="A3" quantity="10">
<info type="ram x2" import="AU" />
</item>
</items>
我需要根据type
添加所有数量,例如我需要输出为
ram x1数量= 8 ram x2数量= 10
<?xml version="1.0" encoding="UTF-8"?>
<items>
<details type="ram x1" quantity="8"/>
<details type="ram x2" quantity="10"/>
</items>
尝试让每个小组先获得数量以确定它是否有效,
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes" />
<xsl:template match="items">
<xsl:for-each-group select="item" group-by="info/@type">
<xsl:value-of select="sum(@quantity)" />
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
使用current-group()
功能,即:
<xsl:value-of select="sum(current-group()/@quantity)" />
答案 1 :(得分:0)
@Kirill Polishchuck已经给出了一个很好的答案,我想添加一个完整的样式表来说明这一点。
它以您应该显示的方式输出格式化的XML。除了使用current-group()
之外,还有一个有趣的current-grouping-key()
应用程序,用于检索导致当前项目组合在一起的值。
您已将xsl:output method
指定为HTML,但您的预期输出看起来像XML。因此,我已将其更改为输出XML。
<强>样式表强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="items">
<xsl:copy>
<xsl:for-each-group select="item" group-by="info/@type">
<details>
<xsl:attribute name="type">
<xsl:value-of select="current-grouping-key()"/>
</xsl:attribute>
<xsl:attribute name="quantity">
<xsl:value-of select="sum(current-group()/@quantity)" />
</xsl:attribute>
</details>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<items>
<details type="ram x1" quantity="8"/>
<details type="ram x2" quantity="10"/>
</items>
更简洁(但更复杂)的版本使用所谓的属性值模板:
<xsl:for-each-group select="item" group-by="info/@type">
<details type="{current-grouping-key()}" quantity="{sum(current-group()/@quantity)}"/>
</xsl:for-each-group>