xsl with sort example condicional xml xslt xslt-grouping

xml - with - Agrupación y suma de XSLT



xslt condicional (1)

Soy nuevo en XSLT y necesito sumar el precio total (Cantidad * PrecioUnidad) de los artículos según la ID de cada pedido, e imprimirlo al final del grupo de cada Artículo usando XSLT 1.0. Aquí está mi ejemplo XML

<Orders> <Order> <Reference>234</Reference> <Item> <ID>10</ID> <Quantity>1</Quantity> <UnitPrice>2</UnitPrice> </Item> <Item> <ID>10</ID> <Quantity>2</Quantity> <UnitPrice>3</UnitPrice> </Item> <Item> <ID>10</ID> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> </Item> <Item> <ID>20</ID> <Quantity>2</Quantity> <UnitPrice>4</UnitPrice> </Item> </Order> <Order> <Reference>456</Reference> <Item> <ID>10</ID> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> </Item> <Item> <ID>20</ID> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> </Item> </Order> </Orders>

El XML de salida deseado está debajo

<SAPOrders> <Order> <Reference>234</Reference> <Item> <Quantity>1</Quantity> <UnitPrice>2</UnitPrice> </Item> <Item> <Quantity>2</Quantity> <UnitPrice>3</UnitPrice> </Item> <Item> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> <Total>12</Notes> </Item> <Item> <Quantity>2</Quantity> <UnitPrice>4</UnitPrice> <Total>8</Notes> </Item> </Order> <Order> <Reference>456</Reference> <Item> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> <Total>4</Notes> </Item> <Item> <Quantity>2</Quantity> <UnitPrice>2</UnitPrice> <Total>4</Total> </Item> </Order> </SAPOrders>


Aquí hay dos problemas: (1) agrupe los artículos por orden y por ID de artículo, y (2) calcule el subtotal para cada uno de dichos grupos.

El primer problema es relativamente fácil y puede resolverse utilizando el método de agrupación Muenchian . El segundo problema es más difícil, ya que XSLT 1.0 no permite sumar el resultado de un cálculo.

La siguiente hoja de estilo comienza por el cálculo previo del precio extendido de cada artículo y el almacenamiento de los resultados en una variable. Luego opera en la variable, agrupando los elementos y subtotalizando cada grupo.

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:key name="item" match="Item" use="@key" /> <xsl:template match="/Orders"> <!-- first pass --> <xsl:variable name="first-pass"> <xsl:for-each select="Order"> <Order> <xsl:copy-of select="Reference"/> <xsl:for-each select="Item"> <Item key="{concat(../Reference, ''|'', ID)}" extPrice="{Quantity * UnitPrice}"> <xsl:copy-of select="*"/> </Item> </xsl:for-each> </Order> </xsl:for-each> </xsl:variable> <!-- output --> <SAPOrders> <xsl:for-each select="exsl:node-set($first-pass)/Order"> <xsl:copy> <xsl:copy-of select="Reference"/> <!-- for each unique item in this order --> <xsl:for-each select="Item[count(. | key(''item'', @key)[1]) = 1]"> <!-- list the items in this group --> <xsl:for-each select="key(''item'', @key)"> <Item> <xsl:copy-of select="Quantity | UnitPrice"/> <!-- add the subtotal of this group --> <xsl:if test="position()=last()"> <Total> <xsl:value-of select="sum(key(''item'', @key)/@extPrice)" /> </Total> </xsl:if> </Item> </xsl:for-each> </xsl:for-each> </xsl:copy> </xsl:for-each> </SAPOrders> </xsl:template> </xsl:stylesheet>

Demostración: http://xsltransform.net/jz1PuPz