2016-03-29 24 views
0

'daki geçerli düğümün değeri olarak toplamı Hedef xml'i, bir düğümün değeri, önceki benzer düğüm değerlerinin toplamının virgülle ayrılmış değerleri olduğu şekilde elde etmeye çalışıyorum. eg için:Önceki düğümlerin XSLT

Girdi:

<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> 

Çıktı: 50 yukarıda Gördüğünüz gibi

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

, (+ 30 50), (50 + 30 + 70)

Her Öğe için denedim ve yalnızca geçerli düğümün ve önceki seçili düğümün toplamını bulabildim. yanıtlar için

<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> 

cevap

-1

Teşekkür: Buraya böyle

1

deneyin şey bana yol misiniz. Ben benim için çalışan bu yaklaşımı takip:

<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

Eğer daha verimli bir çözüm her seferinde toplamı bir değer birikir bir özyinelemeli şablonu kullanmak istiyorsunuz sum(preceding-sibling::...) kullanabilirsiniz iken:

<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

ise XSLT 2.0 ile çözmek istiyorsanız o zaman kullanıcı tanımlı bir fonksiyona ihtiyacınız olduğunu düşünmüyorum, tek bir XPath 2.0 ifadesi yazabilirsiniz:

<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>