En XSL se pueden hacer sumas de nodos de la siguiente forma:
Lo he probado con muchos datos y funciona perfectamente, talvés habría que hacer mas pruebas o buscar otra solución, pero no está de más. Espero que a alguien le sirva.
<xsl:value-of select="/root/product/amount"/>Y listo tenemos el total de esos nodos. Pero, en mi caso, me sucedió un problema, yo debía sumar los nodos pero dependía, por medio de un ID, este ID, debía de existir en otra lista de nodos. Visualicemos, yo tengo el siguiente xml:
<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="main.xsl"?> <root> <valid_products> <valid_product id="123" /> <valid_product id="223" /> </valid_products> <products> <product> <id>123</id> <amount>25</amount> </product> <product> <id>223</id> <amount>30</amount> </product> <product> <id>321</id> <amount>35</amount> </product> </products> </root>La idea es, mostrar el total de los productos pero si existen dentro del nodo valid_products, buscando (y si me llevó un poco de tiempo) decidí hacerlo de la siguiente forma:
<?xml version="1.0" encoding="UTF8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" version="1.0"> <xsl:template match="/"> <xsl:element name="html"> <xsl:element name="body"> <xsl:element name="div"> <xsl:element name="span"> <xsl:text>Total: </xsl:text> </xsl:element> <xsl:element name="span"> <xsl:call-template name="Totalize"></xsl:call-template> </xsl:element> </xsl:element> </xsl:element> </xsl:element> </xsl:template> <xsl:template name="Totalize"> <xsl:variable name="totalNodes"> <xsl:for-each select="/root/products/product"> <xsl:variable name="id"> <xsl:call-template name="FindValidProduct"> <xsl:with-param name="id" select="id" /> </xsl:call-template> </xsl:variable> <xsl:if test="$id != ''"> <number> <xsl:value-of select="amount" /> </number> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:value-of select="sum(exsl:node-set($totalNodes)/number)"/> </xsl:template> <xsl:template name="FindValidProduct"> <xsl:param name="id" /> <xsl:value-of select="/root/valid_products/valid_product[@id = $id]/@id"/> </xsl:template> </xsl:stylesheet>Resumiendo, primero se agrega lo siguiente: xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" en la definición del XSL. Al hacer esto, se pueden crear nodos en el XSL y con la función exsl:node-set() se pueden acceder como que si fuera algún nodo en el XML.
Lo he probado con muchos datos y funciona perfectamente, talvés habría que hacer mas pruebas o buscar otra solución, pero no está de más. Espero que a alguien le sirva.
No hay comentarios:
Publicar un comentario