我想要得到这笔钱。这是xslt代码。
<xsl:template match="Entry">
<xsl:if test="position() <= 10">
<tr>
<td>
<xsl:value-of select="substring-before(@Value,'||')"/>
</td>
<td>
<xsl:value-of select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')"/>
</td>
</tr>
</xsl:if>
</xsl:template>
上面的代码将数据填充为两个coloums。没关系。现在我需要得到<xsl:value-of select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')"/>
的总和
我来自程序编程。我读了很多文章,但我仍然想弄清楚如何得到这个的总和。有人可以帮助我吗?
这是xml
<TopHoldings Currency="xxx">
<Entry Type="CName||C||S||Fund Weight (%)||Benchmark weight (%)" Value="Ab||U||||1.2170000000000||" Date="8/31/2011" />
这是整个xslt
<table style="width:50%;font-size:12px;" cellspacing="0" cellpadding="0">
<tr style="width:50%; text-align:left;background-color:E6F1F9;">
<th> </th>
<th> % of funds </th>
</tr>
<xsl:apply-templates select="$items">
<xsl:sort select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')" order="descending"/>
<xsl:sort select="substring-before(@Value,'||')"/>
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="Entry">
<xsl:if test="position() <= 10">
<tr>
<td>
<xsl:value-of select="substring-before(@Value,'||')"/>
</td>
<td>
<xsl:value-of select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')"/>
</td>
</tr>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
当您需要在XSLT 1.0上对多个值的值求和时,您必须依赖递归[编辑:在XSLT 1.0中函数和它也是可用的](在XSLT 2.0中有一个XPath函数sum())。
以下模板通过elements-to-sum参数执行给定元素的总和,从您指定的属性@Value中提取值为sum。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" />
<xsl:template match="TopHoldings">
<table>
<xsl:call-template name="sum">
<xsl:with-param name="elements-to-sum"
select="Entry" />
</xsl:call-template>
</table>
</xsl:template>
<xsl:template name="sum">
<xsl:param name="elements-to-sum" />
<xsl:param name="sum" select="'0'" />
<!-- Store in variables the following operations to avoid performing them more than once -->
<xsl:variable name="current-element" select="$elements-to-sum[1]" />
<xsl:variable name="current-value" select="format-number(substring(substring-after($current-element/@Value,'||||'),1,10),'#.#')" />
<!-- Output the table row -->
<tr>
<td><xsl:value-of select="substring-before($current-element/@Value, '||')" /></td>
<td><xsl:value-of select="$current-value" /></td>
</tr>
<!-- Determine whether continue -->
<xsl:choose>
<!-- Case END: we have just one element to sum so we perform the sum and we output the desired result -->
<xsl:when test="count($elements-to-sum) = 1">
<tr>
<td>Result:</td>
<td><xsl:value-of select="$current-value + $sum" /></td>
</tr>
</xsl:when>
<!-- Case RECURSION : we call this template again adding the current value to the sum and removing the first element from the parameter elements-to-sum -->
<xsl:otherwise>
<xsl:call-template name="sum">
<xsl:with-param name="elements-to-sum"
select="$elements-to-sum[position() > 1]" />
<xsl:with-param name="sum"
select="$sum + $current-value" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我假设您希望将sum的结果显示为同一个表中的新行,如果不是这种情况,并且您希望在别处显示结果,则解决方案会略有不同。告诉我你是否接受这个解决方案,或者你需要在元素之外显示总和。
注意:我不会在属性@Value中执行那些“复杂”的字符串操作,而是考虑将该属性中的所有信息拆分为不同的属性。
答案 1 :(得分:0)
只需使用XPath函数sum(),它可以在XPath 2.0 for XSLT 2.0和XPath 1.0 for XSLT 1.0中使用,如http://www.w3.org/TR/xpath/#function-sum中所述。如果要获得总和的数字是属性“值”到元素“条目”,请使用sum(// Entry / @ Value)“来获取所有并总结。更改此项以获得您想要的10个元素xml数据。