2016-03-29 3 views
0

Ich versuche, das Ziel XML so zu erhalten, dass der Wert eines Knotens Komma getrennte Werte der Summe vorheriger ähnlicher Knotenwerte ist. Für zB:Summe der vorherigen Knoten als Wert des aktuellen Knotens in XSLT

Eingang:

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

Ausgang:

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

Wie Sie oben es 50 ist zu sehen, (50 + 30), (50 + 30 + 70)

Ich versuchte mit for-jedes Item und konnte die Summe nur des aktuellen Knotens und des vorher ausgewählten Knotens finden.

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

Antwort

-1

Danke für die Antworten: Können Sie mir bitte

1

Probieren Sie etwas wie dies hier führen. Ich folgte diesem Ansatz, der für mich gearbeitet:

<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

Während Sie sum(preceding-sibling::...) eine effizientere Lösung verwenden würde eine rekursive Vorlage verwenden, könnte die Summe einen Wert zu einem Zeitpunkt, zu akkumulieren:

<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

Wenn Sie wollen es mit XSLT 2.0 lösen, dann glaube ich nicht, dass Sie eine benutzerdefinierte Funktion benötigen. Sie können einen einzelnen XPath 2.0-Ausdruck schreiben:

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