XSLT根据另一个值添加属性值

时间:2014-01-08 03:36:39

标签: xml xslt xpath xslt-2.0

如何根据其他值添加值?

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

2 个答案:

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