Multiplica 2 números y sum

Estoy teniendo dificultades para hacer algo que parece que debería ser realmente fácil de hacer. Básicamente quiero multiplicar 2 números en un nodo y luego sumr el total de esos números para todos los nodos. Aquí está el código XSLT que he intentado.

 

Este código da como resultado un error que dice “El argumento 1 de la sum de la función no se puede convertir a un conjunto de nodos”.

¿Alguien tiene una idea de lo que está mal o cómo puedo lograr lo que estoy tratando de hacer?

Aquí hay tres soluciones posibles :

Solución1 XSLT2:

       

Cuando se aplica esta transformación en el siguiente documento XML :

   0.37 10   0.03 10   

El resultado deseado es producido :

4

La solución XSLT 2.0 usa el hecho de que en XPath 2.0 se permite que el argumento correcto del último operador “/” pueda ser una expresión o generalmente una función. Esta expresión / función se aplica para cada uno de los nodos seleccionados hasta ahora que actúan como el nodo de contexto, y cada aplicación de función produce un resultado.

Solution2 XSLT 1.0:

                         

Cuando se aplica en el documento XML anterior, se produce el resultado correcto :

4

Esta es una solución recursiva XSLT 1.0 típica . Observe cómo la plantilla sumProducts llama de forma recursiva , hasta que se procesa toda la lista de entrada, pasada en el parámetro $pList .

Solution3 FXSL (XSLT 1.0):

                             

Cuando se aplica esta transformación en el siguiente documento XML :

   3.5 2 0.75 0.80 0.90   3.5 2 0.75 0.80 0.90   

El resultado correcto es producido :

7.5600000000000005

En el último caso para cada sale , calculamos el producto de price , quantity y todos los discount disponibles (número variable de).

FXSL es una implementación XSLT pura de funciones de orden superior. En este ejemplo, la función de orden superior f:map() se utiliza para asignar la función f:product() en la lista de elementos secundarios de cada elemento de sale . Luego, los resultados se sumn para producir el resultado final.

Todas las soluciones de Dimitre funcionan y tiene razón en que no necesita usar funciones de extensión, pero a veces hace la vida más fácil. No es demasiado dañino, especialmente cuando usa extensiones exslt que son compatibles con múltiples procesadores XSLT. Además, la razón por la que está obteniendo los errores de secuencia es probablemente porque está usando un procesador XSLT 1.

Si desea continuar con la solución elegida, deberá usar Saxon o algún otro procesador XSLT compatible con XSLT 2.

De lo contrario, aquí hay un método alternativo para hacerlo en XSLT 1. Esto funcionará en la mayoría de los procesadores XSLT y algunos peope pueden encontrarlo más fácil de asimilar que la versión recursiva. Personalmente, prefiero la versión recursiva (tercera propuesta de Dimitre) porque es más portátil.