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>

上面的代码会将数据填充为两个列。没关系。现在我需要<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>
4

2 回答 2

2

当您需要对 XSLT 1.0 上多个值的值求和时,您必须依赖递归 [编辑:在 XSLT 1.0 中,函数 sum 它也可用](在 XSLT 2.0 中有一个 XPath 函数 sum())。

以下模板通过 elements-to-sum 参数执行给定元素的总和,从您指定的属性 @Value 中提取要求和的值。

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

我假设您想在同一个表中将总和的结果显示为新行,如果不是这种情况并且您想在其他地方显示结果,则解决方案会略有不同。告诉我您是否可以接受此解决方案,或者您需要在元素外显示总和。

注意:我不会在属性@Value 中执行那些“复杂”的字符串操作,而是考虑将该属性中的所有信息拆分为不同的属性。

于 2013-02-08T12:19:31.173 回答
0

只需使用 XPath 函数 sum(),它在用于 XSLT 2.0 的 XPath 2.0 和用于 XSLT 1.0 的 XPath 1.0 中都可用,如http://www.w3.org/TR/xpath/#function-sum中所述。如果您要获得总和的数字是元素“Entry”的属性“Value”,请使用 sum(//Entry/@Value)" 获取所有并求和。更改此设置以获得您想要的 10 个元素xml 数据。

于 2013-02-08T12:49:35.503 回答