Ejemplo: asignar nombres de elemento a valores de atributo

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

Inicio >  Diseño de asignaciones > Asignar nombres de nodos >

Ejemplo: asignar nombres de elemento a valores de atributo

Este ejemplo demuestra cómo asignar nombres de elemento de un documento XML a valores de atributo de un documento XML de destino. El ejemplo viene acompañado del diseño de asignación <Documentos>\Altova\MapForce2019\MapForceExamples\Tutorial\ConvertProducts.mfd.

 

Para comprender cómo funciona el ejemplo primero debemos imaginar que tenemos un archivo XML que contiene una lista de productos. Cada producto tiene este formato:

 

  <product>

    <id>1</id>

    <color>red</color>

    <size>10</size>

  </product>

 

Nuestro objetivo es convertir la información disponible sobre cada producto en pares de nombre/valor. Por ejemplo:

 

  <product>
    <attribute name="id" value="1" />
    <attribute name="color" value="red" />
    <attribute name="size" value="10" />
</product>

 

Para conseguirlo el diseño de asignación del ejemplo utiliza la característica de MapForce conocida como "acceso dinámico a nombres de nodo". El término dinámico hace referencia al hecho de que, cuando se ejecute la asignación, se podrán leer los nombres de nodo (no solo los valores) y estos nombres se podrán usar como valores. A continuación explicamos cómo diseñar esta asignación.

 

Paso nº1: agregar el componente XML de origen a la asignación

En el menú Insertar haga clic en el comando Archivo o esquema XML y navegue hasta el archivo <Documentos>\Altova\MapForce2019\MapForceExamples\Tutorial\Products.xml. Este archivo XML apunta al esquema Products.xsd que está situado en la misma carpeta.

 

Paso nº2: agregar el componente XML de destino a la asignación

En el menú Insertar haga clic en el comando Archivo o esquema XML y navegue hasta el archivo de esquema <Documentos>\Altova\MapForce2019\MapForceExamples\Tutorial\ProductValuePairs.xsd. Cuando la aplicación solicite un archivo de instancia, haga clic en Omitir. Cuando solicite un elemento raíz, seleccione products.

 

Llegados a este punto el diseño tendrá este aspecto:

mf_map_ConvertProducts_01

 

Paso nº3: habilitar el acceso dinámico a los nodos secundarios

1.Haga clic con el botón derecho en el nodo product del componente de origen y seleccione Mostrar elementos secundarios con nombre dinámico en el menú contextual.
2.En el cuadro de diálogo que aparece seleccione el tipo text() y deje las demás opciones como están.

mf_map_ConvertProducts_02

 

Observe que esto añade un nodo llamado text() al componente de origen. Este nodo se encargará de suministrar el contenido de los elementos secundarios a la asignación (en este caso, el valor de "id", "color" y "size").

mf_map_ConvertProducts_03

 

Paso nº4: dibujar las conexiones de asignación de datos

Por último, debemos dibujar las conexiones de asignación de datos A, B, C y D que pueden verse en la imagen siguiente (si quiere, haga doble clic en cada línea de conexión, empezando por la primera, e introduzca el texto "A", "B", "C" y "D" respectivamente en el cuadro Descripción.

mf_map_ConvertProducts_04

ConvertProducts.mfd

En el diseño de asignación anterior, la conexión A crea en el componente de destino un producto por cada producto del componente de origen. Se trata de una conexión estándar de MapForce que no se ocupa de los nombres de los nodos. Sin embargo, la conexión B crea en el componente de destino un elemento nuevo llamado attribute por cada elemento secundario de product del componente de origen.

 

La conexión B es una conexión crucial en la asignación pues se encarga de transferir una secuencia de elementos secundarios de product desde el componente de origen al componente de destino. No transfiere los nombres ni valores propiamente dichos. Por tanto, debe entenderse de la siguiente forma: si el element() de origen tiene X secundarios, entonces crea X instancias de dicho elemento en el componente de destino. En este caso concreto, product tiene tres secundarios en el componente de origen (id, color y size). Esto significa que cada product del componente de destino tendrá tres secundarios llamados attribute.

 

Aunque ahora no es el caso, la misma regla puede utilizarse para asignar elementos secundarios de attribute(): si el elemento attribute() de origen tiene X atributos secundarios, la conexión creará X instancias de dicho elemento en el componente de destino.

 

Después, la conexión C copia el nombre real de cada elemento secundario de product en el componente de destino (literalmente "id", "color" y "size").

 

Por último, la conexión D copia el valor de cada elemento secundario de product (como tipo string) en el componente de destino.

 

Para consultar una vista previa de los resultados de la asignación abrimos el panel Resultados y consultamos el XML que se genera. Tal y como esperábamos, el resultado contiene varios productos cuyos datos están almacenados como pares nombre/valor.

 

<?xml version="1.0" encoding="UTF-8"?>
<products xsi:noNamespaceSchemaLocation="ProductValuePairs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <product>
    <attribute name="id" value="1"/>
    <attribute name="color" value="red"/>
    <attribute name="size" value="10"/>
  </product>
  <product>
    <attribute name="id" value="2"/>
    <attribute name="color" value="blue"/>
    <attribute name="size" value="20"/>
  </product>
  <product>
    <attribute name="id" value="3"/>
    <attribute name="color" value="green"/>
    <attribute name="size" value="30"/>
  </product>
</products>

Resultado de la asignación


© 2019 Altova GmbH