0

合計を出力しようとしましたが、各値の合計が出力されます。総額を出したい。xsl でグローバル変数を使用する方法

sum を取得する例として、単純にsum = sum + value;value を新しく取得したもの、sum を既存の値と書くことができます。私が気づいたのは、常に xsl で上書きされることです。

ここに私が使用したコードがあります

<xsl:template match="Top">
  <xsl:if test="position() &lt;= 10">


    <xsl:variable name="items"
             select="/TopHoldings/TopHoldingsEntry
             [@Type='Company Name||Co||Se||F Weight (%)||Benchmark weight (%)']
             [@Date='8/31/2011']" />

    <xsl:variable name="totalMarks" 
         select="format-number(substring(substring-after(@Value,'||||'),1,10),'#.#') + 
                 format-number(substring(substring-after(@Value,'||||'),1,10),'#.#')"/>
    <xsl:value-of select="$totalMarks" />

  </xsl:if>
</xsl:template>

私はどこで間違ったことをしましたか?xml コード

<TopHoldings Currency="xxx">
          <TopHoldingsEntry Type="CName||C||S||Fund Weight (%)||Benchmark weight (%)" Value="Ab||U||||1.2170000000000||" Date="8/31/2011" />
          <TopHoldingsEntry Type="CName||C||S||Fund Weight (%)||Benchmark weight (%)" Value="Acc||I||||1.2170000000000||" Date="7/31/2011" />
4

2 に答える 2

2

sum=sum+value を考えているという事実は、ループを記述して変数の値を変更することにより、手続き型言語で行うのと同じようにこれを実行しようとしていることを示唆しています。XSLT は手続き型言語ではないため、考え方を変える必要があります。

XSLT 2.0 では、これは単純です。

format-number(
   sum(for $x in TopHoldingsEntry/@Type return number(substring-after('||||'))),
   ....)

XSLT 1.0 では、もう少し難しくなります。「兄弟再帰」を使用してそれを行います:

<xsl:template match="TopHoldingsEntry">
  <xsl:param name="total" select="0"/>
  <xsl:choose>
    <xsl:when test="following-sibling::*">
      <xsl:apply-templates select="following-sibling::*[1]">
         <xsl:with-param name="total" select="$total + number(substring-after(....))"/>
      </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$total"/>
    </xsl:otherwise>
  <xsl:choose>
</xsl:template>

次に、プロセスを起動します<xsl:apply-templates select="TopHoldingsEntry[1]"/>

于 2013-01-31T14:01:18.163 に答える
0

数値をフォーマットする前に合計する

<xsl:variable name="total">
    <xsl:value-of select="number(substring(substring-after(@Value,'||||'),1,10))+
       number(substring(substring-after(@Value,'||||'),1,10))"/>
</xsl:variable>
<xsl:variable name="totalMarks" select="format-number($total,1,10),'#.#')"/>
于 2013-01-31T11:06:06.027 に答える