2016-03-29 11 views
0

ノードの値が前の類似ノード値の合計のカンマ区切り値となるようにターゲットxmlを取得しようとしています。例えばのため:XSLTの現在のノードの値として以前のノードの合計

入力:

<Items> 
    <Item> 
    <name>Drakshi</name> 
    <price>50</price> 
    </Item> 
    <Item> 
    <name>Godambi</name> 
    <price>30</price> 
    </Item> 
    <Item> 
    <name>Badami</name> 
    <price>70</price> 
    </Item> 
</Items> 

出力:それは50である上に、あなたが見ることができるように

<result> 
50,80,150 
</result> 

、(+ 30 50)、(50 + 30 + 70)

私はそれぞれのアイテムについて試してみたところ、現在のノードと以前に選択されたノードだけの合計を見つけることができました。返信用

<xsl:template match="Items"> 
    <result> 
    <xsl:for-each select="Item"> 
     <xsl:value-of select="sum(preceding-sibling::Item/price | price) " /> 
     <xsl:if test="position() != last()">, </xsl:if> 
    </xsl:for-each> 
    </result> 
</xsl:template> 

答えて

-1

ありがとう:あなたはこのような何かを試してみてくださいここ

1

を私を導いてくださいすることができます。私は私のために働いていた、このアプローチを踏襲:

<xsl:function name="kk:getSumTillIndex"> 
    <xsl:param name="index"/>  
    <xsl:variable name="Var_PriceArray" select="$Items/item[position()&lt;=$index]//price/text()"/> 
    <xsl:for-each select="$Var_PriceArray"> 
     <Item> 
      <xsl:value-of select="current()"/> 
     </Item> 
    </xsl:for-each> 
</xsl:function> 


<xsl:function name="kk:calulatePriceSequence"> 
    <xsl:variable name="set" select="$Items/Item" /> 
    <xsl:variable name="count" select="count($set)" /> 

    <xsl:for-each select="$set"> 
     <xsl:if test="position() &lt;= $count"> 
     <xsl:value-of select="sum(kk:getSumTillIndex(position()))"/> 

      <xsl:if test="position() &lt; number($count)-1"> 
       <xsl:value-of select="','" /> 
      </xsl:if> 
     </xsl:if> 
     </xsl:for-each> 
</xsl:function> 
1

あなたが、より効率的なソリューションを一度に合計に一つの値を蓄積するために再帰的なテンプレートを使用するsum(preceding-sibling::...)を使用することができますが:

<xsl:template match="/Items"> 
    <result> 
     <xsl:call-template name="run-total"> 
      <xsl:with-param name="values" select="Item/price"/> 
     </xsl:call-template> 
    </result> 
</xsl:template> 

<xsl:template name="run-total"> 
    <xsl:param name="values"/> 
    <xsl:param name="i" select="1"/> 
    <xsl:param name="total" select="0"/> 
    <xsl:variable name="balance" select="$total + $values[$i]" /> 
    <xsl:value-of select="$balance" /> 
    <xsl:if test="$i &lt; count($values)"> 
     <xsl:text>,</xsl:text> 
     <xsl:call-template name="run-total"> 
      <xsl:with-param name="values" select="$values"/> 
      <xsl:with-param name="i" select="$i + 1"/> 
      <xsl:with-param name="total" select="$balance"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
1

の場合あなたはXSLT 2.0でそれを解決したいと思いますが、ユーザー定義の関数が必要ないとは思わないので、単一のXPath 2.0式を書くことができます:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

<xsl:template match="Items"> 
    <result> 
     <xsl:value-of 
      select="for $pos in 1 to count(Item) 
        return sum(subsequence(Item, 1, $pos)/price)" 
      separator=","/> 
    </result> 
</xsl:template> 

</xsl:stylesheet> 
関連する問題