如何在xslt中获取属性中的值的总和

时间:2013-02-08 10:57:19

标签: xslt xslt-1.0

我想要得到这笔钱。这是xslt代码。

<xsl:template match="Entry">
    <xsl:if test="position() &lt;= 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() &lt;= 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>

2 个答案:

答案 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数据。