2011-08-12 7 views
0

をトラブル:(XSLT再帰合計が、私は、再帰的な合計に複数のノードからの属性をしようとすると、それは文字列のように糊付けだ


XMLファイル(第2走行距離-ノードは、最初の走行距離・ノードが含まれる)

<mileage value="15000"> 
    <operation title="Replacing the engine oil" cost="500" /> 
    <sparepart title="Oil filter" cost="250" /> 
    <sparepart title="Motor oil" cost="1050" /> 
</mileage> 
<mileage value="30000"> 
    <repeating mileage="15000" /> 
    <operation title="Replacement of spark" cost="1200" /> 
</mileage> 

XSL-テンプレート

<xsl:template match="mileage[@value]"> 
    <xsl:param name="sum" select="number(0)" /> 
    <xsl:variable name="milinkage"><xsl:value-of select="number(repeating/@mileage)" /></xsl:variable> 
    <xsl:apply-templates select="parent::*/mileage[@value=$milinkage]"><xsl:with-param name="sum" select="number($sum)" /></xsl:apply-templates> 
    <xsl:value-of select="number(sum(.//@cost))"/> <!-- + number($sum) --> 
</xsl:template> 

集成結果は18001200ですが、私は ここで間違っているものを私に教えてください3000(+ 1200 1800)を参照してくださいしたいですか?

Thanx!

+0

申し訳ありませんが、それは私の最初のポストstackoverflowです。 – Yuri

+0

私は自分の答えを編集しました。これがあなたの問題を解決することを願っています。 – therealmarv

答えて

0

あなたが必要のxmlns:exsl = "http://exslt.org/common"

<xsl:template match="/"> 
    <xsl:variable name="nodes"> 
     <xsl:apply-templates select="root/mileage[position()=last()]"/> 
    </xsl:variable> 
    <xsl:copy-of select="sum(exsl:node-set($nodes)/*[@cost]/@cost)"/> 
</xsl:template> 

<xsl:template match="mileage"> 
    <xsl:copy-of select="*[@cost]"/> 
    <xsl:apply-templates select="../mileage[@value=current()/repeating/@mileage]"/> 
</xsl:template>` 
+0

** @A。 Haaji **、高すぎる、しかしは繰り返すことができ、複数のネスティングを持つことができます。例: ''ここでタグを2回開催しました。最初にmilage = "30000"を入力し、 15000 "となる。 今、変数合計を累積してすでに合計している再帰的テンプレートを理解できません。 "コスト"を持つ属性のすべての要素を含む一時的なツリーノードを作成するのは正しいでしょうか? – Yuri

+0

@Yuriは、一時的なツリーかもしれませんが、実際には最高の解決策になります。コードを更新しました。 –

0

を(開始点から独立した)すべての@costsが加算されますので、ドットを削除して、あなたは常に3000が表示されます。

<xsl:value-of select="number(sum(//@cost))"/> <!-- + number($sum) --> 

出力は次のようになります。30003000

しかし、私は何かがあなたのアプローチが間違っていることを前提としています。テンプレートを再帰的に呼び出すと、テンプレートはあなたのケースで自分自身を呼び出すほど出力されます。正しい結果を与える

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="root"/> 
</xsl:template> 

<xsl:template match="root"> 
    <xsl:apply-templates select="mileage[@value=30000]"/> 
</xsl:template> 

<xsl:template match="mileage[@value]"> 
    <xsl:param name="sum" select="number(0)" /> 
    <xsl:variable name="milinkage"><xsl:value-of select="number(repeating/@mileage)" /></xsl:variable> 
    <xsl:variable name="newsum"> 
     <xsl:value-of select="number(sum(.//@cost)) + $sum"/> 
    </xsl:variable> 
    <xsl:apply-templates select="parent::*/mileage[@value=$milinkage]"><xsl:with-param name="sum" select="number($newsum)" /></xsl:apply-templates> 
    <xsl:if test="not(parent::*/mileage[@value=$milinkage])"> 
     <xsl:value-of select="$newsum"/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

<root> 
<mileage value="15000"> 
    <operation title="Replacing the engine oil" cost="500" /> 
    <sparepart title="Oil filter" cost="250" /> 
    <sparepart title="Motor oil" cost="1050" /> 
</mileage> 
<mileage value="30000"> 
    <repeating mileage="15000" /> 
    <operation title="Replacement of spark" cost="1200" /> 
</mileage> 
</root> 

と、このXSLTを使用して:あなたは、この入力を考えると、あなたの再帰

の最後に結果をプリントアウトする必要があります3000

関連する問題