XSLT accumulates

I have a parent variable and two child variables to accumulate

I would like to use these two child variables to select two different values

I can only write it hard so that it works, like all other tutorials for example: $ parent [1] / Price and $ parent [1] / Quantity

but instead I want the following:

$parent[1]/$child1 where $parent[1] = orders[1]/order and $child1 = price $parent[1]/$child2 where $parent[1] = orders[1]/order and $child2 = quantity <xsl:call-template name="total"> <xsl:with-param name="pList" select="$parent"/> <xsl:with-param name="price" select="Price"/> <xsl:with-param name="quantity" select="Quantity"/> </xsl:call-template> <xsl:template name="total"> <xsl:param name="pListItem"/> <xsl:param name="pAccum" select="0"/> <xsl:param name="price"/> <xsl:param name="quantity"/> <xsl:choose> <xsl:when test="$pListItem"> <xsl:call-template name="total"> <xsl:with-param name="pListItem" select="$pListItem[position() > 1]"/> <xsl:with-param name="pAccum" select="$pAccum + $vHead/$price * $vHead/$quantity"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$pAccum"/> </xsl:otherwise> </xsl:choose> </xsl:template> 
+2
source share
2 answers

It is not clear what the question is, but I guess that is.

This conversion is :

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:param name="pPriceName" select="'price2'"/> <xsl:param name="pQuantityName" select="'quantity1'"/> <xsl:template match="/"> <xsl:call-template name="totalSales"> <xsl:with-param name="pSales" select="/*/*"/> <xsl:with-param name="pPriceName" select="$pPriceName"/> <xsl:with-param name="pQuantityName" select="$pQuantityName"/> </xsl:call-template> </xsl:template> <xsl:template name="totalSales"> <xsl:param name="pAccum" select="0"/> <xsl:param name="pSales"/> <xsl:param name="pPriceName"/> <xsl:param name="pQuantityName"/> <xsl:variable name="vthisSale" select="$pSales[1]"/> <xsl:choose> <xsl:when test="not($vthisSale)"> <xsl:value-of select="$pAccum"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="totalSales"> <xsl:with-param name="pAccum" select= "$pAccum + $vthisSale/*[name()=$pPriceName] * $vthisSale/*[name()=$pQuantityName] "/> <xsl:with-param name="pSales" select= "$pSales[position() >1]"/> <xsl:with-param name="pPriceName" select="$pPriceName"/> <xsl:with-param name="pQuantityName" select="$pQuantityName"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 

when applied to the following XML document (you could at least provide this!):

 <orders> <order> <price1>10</price1> <quantity1>3</quantity1> <price2>15</price2> <quantity2>1</quantity2> </order> <order> <price1>11</price1> <quantity1>2</quantity1> <price2>9</price2> <quantity2>3</quantity2> </order> </orders> 

creates the desired, correct result:

 63 

Pay attention . The values โ€‹โ€‹of the names of the children, which will serve as the price and quantity, are provided as external parameters for conversion and can only be known at run time.

+2
source

Thank you very much.
All I need is " Price " and $vthisSale/*[name()=$pPriceName]

It really helps !! Iโ€™ve been stuck for centuries because of the magic

0
source

Source: https://habr.com/ru/post/1386916/


All Articles