2009-06-09 14 views
0

は私がXSLを通じ歩いていXMLフラグメントを持って言う:xslに値の合計を格納できますか?

<Columns> 
    <Column width="100"> 
    <Column width="50"> 
    <Column width="75"> 
    <Column width="33"> 
</Columns> 

基本的に私が何をしたいのか、私は、各ノードを歩いていて、ですが、私は以前の「幅の合計を格納する必要があります'属性を現在の列ノードに使用します。たとえば、最後のColumnノード(幅33)に到達すると、何らかの種類の変数(100 + 50 + 75)のすべての以前の幅の合計にアクセスしたいと考えています。 XSLで一度変数の値を変更することはできないことを知っていますので、テンプレートのパラメータや何かを使ってこれを行う方法があるのだろうかと思います。前もって感謝します!

+0

どのXSLTエンジンを使用していますか? –

+0

.NET xsltエンジン – Nate

答えて

1

基本的に、テンプレートの再帰を利用し、次の兄弟にのみ渡されるセットを制限します。最初の項目から始めて、更新された値を次のテンプレート呼び出しに引き続き渡すことができます。

<xsl:template match="/"> 
    <xsl:apply-templates select="Columns/Column[1]" /> 
</xsl:template> 

<xsl:template match="Column"> 
    <xsl:param name="runningtotal" select="0"/> 
    [<xsl:value-of select="@width"/>:<xsl:value-of select="[email protected]"/>] 
    <xsl:apply-templates select="following-sibling::Column[1]" > 
     <xsl:with-param name="runningtotal" select="[email protected]"/> 
    </xsl:apply-templates> 
</xsl:template> 
+0

これは私にとってはうまくいくと思いますが、for-eachステートメントの文脈ではこれがどこに当てはまるのかちょっと混乱していると思います。 for-eachステートメント内でを呼び出しますか?私は、基本的に 'for-each'のColumnノードを歩いているときに、現在の$ runningtotal変数を印刷したいと考えています。 – Nate

+0

ああ、今すぐ取得します。 'for-each'。どうもありがとうございました! – Nate

+0

ちょうどそうです - テンプレートは* for-eachよりもかなり強力です*と、より多くのXSLのやり方があります。私が思うように、非機能プログラミングのバックグラウンドから学ぶのは難しい概念ですが、apply-templates> call-template> for eachが理想的です。 Jeni Tにこれに関するoodの議論があります:http://www.jenitennison.com/blog/node/9 – annakata

関連する問題