Ejemplo: sumar valores de nodos

www.altova.com Imprimir este apartado Página anterior Subir un nivel Página siguiente

Inicio >  Funciones > Importar funciones XSLT 1.0/2.0 personales >

Ejemplo: sumar valores de nodos

Este ejemplo explica cómo procesar varios nodos de un documento XML y asignar el resultado en forma de un solo valor a un documento XML de destino. Concretamente el objetivo de esta asignación de datos es calcular el precio de todos los productos de un archivo XML de origen y escribirlo como un solo valor en un archivo XML de salida. Los archivos utilizados en este ejemplo están en la carpeta <Documentos>\Altova\MapForce2019\MapForceExamples\Tutorial\:

 

Summing-nodes.mfd: el archivo de asignación de datos
input.xml: el archivo XML de origen
input.xsd: el esquema XML de origen
output.xsd: el esquema XML de destino
Summing-nodes.xslt: una hoja de estilos XSLT personal que contiene una plantilla con nombre que sumará los nodos.

 

Hay dos maneras de conseguir nuestro objetivo:

 

con ayuda de la función de agregado sum de la biblioteca core.
importando una hoja de estilos XSLT personal en MapForce.

 

Solución nº1: usar la función de agregado "sum"

Para usar la función de agregado sum a la asignación basta con arrastrarla desde la ventana Bibliotecas hasta el panel de asignación. Recuerde que las funciones que aparecen en la ventana Bibliotecas dependen del lenguaje de transformación que esté seleccionado. Tras colocar la función en el área de asignación deberá crear las conexiones de asignación que aparecen en esta imagen:

mf_map_summing-nodes1

 

Para más información sobre las funciones de agregado de la biblioteca core consulte el apartado core | aggregate functions (agregado).

 

Solución nº2: usar una hoja de estilos XSLT personal

El objetivo del ejemplo es sumar los campos Price de los productos del archivo XML de origen (en este caso los productos A y B).

 

<?xml version="1.0" encoding="UTF-8"?>
<Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="input.xsd">
  <Products>
    <Product>
        <Name>ProductA</Name>
        <Amount>10</Amount>
        <Price>5</Price>
    </Product>
    <Product>
        <Name>ProductB</Name>
        <Amount>5</Amount>
        <Price>20</Price>
    </Product>
  </Products>
</Input>

 

A continuación puede ver una hoja de estilos XSLT personal que usa la plantilla con nombre "Total" y un solo parámetro string. La plantilla recorre el archivo XML de entrada y suma todos los valores que obtiene la expresión /Product/Price.

 

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 
  <xsl:template match="*">
    <xsl:for-each select=".">
    <xsl:call-template name="Total">
        <xsl:with-param name="string" select="."/>
    </xsl:call-template>
    </xsl:for-each>
  </xsl:template>
   
  <xsl:template name="Total">
  <xsl:param name="string"/>
    <xsl:value-of select="sum($string/Product/Price)"/>
  </xsl:template>
</xsl:stylesheet>

 

Nota:para sumar los nodos en XSLT 2.0 debe cambiar la declaración de hoja de estilos por version="2.0".

 

Para importar la hoja de estilos XSLT en MapForce:

 

1.Seleccione el lenguaje de transformación XSLT.
2.En la ventana Bibliotecas haga clic en el botón Agregar o quitar bibliotecas.
3.En el cuadro de diálogo "Opciones" haga clic en el botón Agregar.
4.Navegue hasta el archivo <Documentos>\Altova\MapForce2019\MapForceExamples\Tutorial\Summing-nodes.xslt.
5.Arrastre la función Total de la biblioteca recién añadida (Summing-nodes) hasta el área de asignación y cree las conexiones que aparecen en esta imagen:

mf_map_summing-nodes2

 

Haga clic en el panel Resultados para obtener una vista previa del resultado de la asignación. La suma de los dos campos Price aparecen ahora en el campo Total.

 

<?xml version="1.0" encoding="UTF-8"?>
<Output xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="output.xsd">
  <Total>25</Total>
  <Product>
    <Name>ProductA</Name>
    <Amount>10</Amount>
    <Price>5</Price>
  </Product>
  <Product>
    <Name>ProductB</Name>
    <Amount>5</Amount>
    <Price>20</Price>
  </Product>
</Output>


© 2019 Altova GmbH