XSLT 对两个属性的乘积求和

标签 xslt xpath sum

我有以下 XML 源结构:

<turnovers>
    <turnover repid="1" amount="500" rate="0.1"/>
    <turnover repid="5" amount="600" rate="0.5"/>
    <turnover repid="4" amount="400" rate="0.2"/>
    <turnover repid="1" amount="700" rate="0.05"/>
    <turnover repid="2" amount="100" rate="0.15"/>
    <turnover repid="1" amount="900" rate="0.25"/>
    <turnover repid="2" amount="1000" rate="0.18"/>
    <turnover repid="5" amount="200" rate="0.55"/>
    <turnover repid="9" amount="700" rate="0.40"/>
</turnovers>

我需要一个 XSL:value-of select 语句,它将返回给定代表 ID 的 rate 属性和 amount 属性的乘积之和。所以对于代表 5,我需要 ((600 x 0.5) + (200 x 0.55))。

最佳答案

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:template match="/turnovers">
    <val>
      <!-- call the sum function (with the relevant nodes) -->
      <xsl:call-template name="sum">
        <xsl:with-param name="nodes" select="turnover[@repid='5']" />
      </xsl:call-template>
    </val>
  </xsl:template>

  <xsl:template name="sum">  
    <xsl:param name="nodes" />
    <xsl:param name="sum" select="0" />

    <xsl:variable name="curr" select="$nodes[1]" />

    <!-- if we have a node, calculate & recurse -->
    <xsl:if test="$curr">
      <xsl:variable name="runningsum" select="
        $sum + $curr/@amount * $curr/@rate
      " />
      <xsl:call-template name="sum">
        <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" />
        <xsl:with-param name="sum"   select="$runningsum" />
      </xsl:call-template>
    </xsl:if>

    <!-- if we don't have a node (last recursive step), return sum -->
    <xsl:if test="not($curr)">
      <xsl:value-of select="$sum" />
    </xsl:if>

  </xsl:template>
</xsl:stylesheet>

给出:
<val>410</val>

两人<xsl:if> s 可以替换为单个 <xsl:choose> .这意味着在递归过程中少了一项检查,但也意味着要多加两行代码。

关于XSLT 对两个属性的乘积求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333558/

相关文章:

javascript - 使用 Translate 函数删除 xml 中的换行符,但如何忽略某些标签?

mysql - SQL 对按另一列分组的列求和

mysql - 在MYSQL中获取毫克、克、公斤的总和

xpath - XSLT 使用 XSLT 数组过滤结果

pdf - 这个 Apache FOP 错误是什么意思?

php - php xpath查询以基于重复子节点中的值获取父节点

.net - 这个 XPath 查询有什么问题?

xml - Xpath获取所有元素至少有一个属性

MySQL |如果 ID 不同,则求和列

java - 使用 Saxon 的 XML 和 XSL 文件