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>

上記のコードは、データを 2 つの列としてフィリングします。大丈夫です。<xsl:value-of select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')"/> ここで、手続き型プログラミングから I amの合計を取得する必要があります。私は多くの記事を読みましたが、これの合計を取得する方法をまだ理解していません。誰でも私を助けることができますか?

ここに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() を使用するだけで、 http://www.w3.org/TR/xpath/#function-sumで説明されているように、XSLT 2.0 用の XPath 2.0 と XSLT 1.0 用の XPath 1.0 の両方で使用できます。合計を取得したい数値が属性「Value」から要素「Entry」である場合は、sum(//Entry/@Value) を使用してすべてを取得し、合計します。これを変更して、必要な 10 個の要素を取得しますxml データ。

于 2013-02-08T12:49:35.503 に答える