Altova MapForce 2026 Professional Edition

Cuando un nodo de un componente XML (o un campo de un componente CSV/FLF) tiene nodos secundarios, podemos obtener tanto el nombre como el valor de cada nodo secundario en la asignación directamente. Esta técnica se denomina «nombres de nodo dinámicos». El adjetivo «dinámicos» hace referencia al hecho de que el procesamiento se realiza «sobre la marcha», durante la ejecución de la asignación, y no se basa en la información estática del esquema que se conoce antes de que se ejecute la asignación. En este apartado explicamos cómo habilitar el acceso dinámico a nombres de nodo y cómo utilizarlo.

 

Cuando se leen datos de un componente de origen, los nombres de nodo dinámicos permiten:

 

Obtener una lista de nodos o atributos secundarios de un nodo en forma de secuencia. En MapForce, una «secuencia» es una lista de cero o más elementos que se pueden conectar a un destino y crear tantos elementos en el destino como haya elementos en el origen. Por ejemplo, si un nodo tiene cinco atributos en el componente de origen, puede crear cinco elementos nuevos en el componente de destino (cada uno de ellos corresponderá a un atributo).

Leer no solo los valores de los nodos secundarios (como hacen las asignaciones normales y corrientes) sino también sus nombres.

 

Cuando se escriben datos en un componente de destino, los «nombres de nodo dinámicos» permiten:

 

Crear nuevos nodos utilizando nombres proporcionados por la asignación (los denominados nombres «dinámicos»), en contraposición a los nombres proporcionados por la configuración del componente (los denominados nombres «estáticos»).

 

Para mostrar cómo funcionan los nombres de nodos dinámicos, en este tema usamos el siguiente esquema XML: <Documentos>\Altova\MapForce2026\MapForceExamples\Tutorial\Products.xsd. Este esquema viene acompañado de un documento de instancia llamado Products.xml. Para agregar tanto el esquema como el archivo de instancia al área de asignación seleccione Insertar | Archivo o esquema XML y navegue hasta el archivo <Documentos>\Altova\MapForce2026\MapForceExamples\Tutorial\Products.xml. Cuando la aplicación solicite un elemento raíz, seleccione products.

 

Para habilitar los nombres de nodo dinámicos para el nodo product, haga clic con el botón derecho en ese nodo y seleccione uno de estos comandos en el menú contextual:

 

Mostrar atributos con nombre dinámico si desea tener acceso a los atributos del nodo o

Mostrar elementos secundarios con nombre dinámico si desea tener acceso a los elementos secundarios del nodo.

mf_dynamic_node_names_01

Fig. 1        Habilitar nombres de nodos dinámicos (para elementos secundarios)

Nota: Los comandos anteriores solo están disponibles para los nodos que tienen nodos secundarios. Además, estos comandos no están disponibles cuando se trata del nodo raíz.

 

Cuando se cambia un nodo al modo dinámico, aparece un cuadro de diálogo como el de la imagen siguiente. Con el fin de tratar este tema, configure las opciones como se muestra a continuación. Estas opciones se describen con más detalle en Obtener acceso a determinado tipo de nodos.

mf_dynamic_node_names_02

Fig.2        Cuadro de diálogo Configuración de secundarios con nombre dinámico

A continuación explicamos lo que hace el componente cuando se habilitan los nombres de nodo dinámicos para el nodo product. Observe que el aspecto del componente cambia significativamente.

mf_generic_child_elements

Fig.3        Nombres de nodos dinámicos habilitados (para elementos)

Para restaurar el modo estándar del componente haga clic con el botón derecho en el nodo product y desactive el comando Mostrar elementos secundarios con nombre dinámico en el menú contextual.

 

La imagen siguiente muestra cómo se ve el mismo componente cuando se habilita el acceso dinámico a los atributos de un nodo. El componente se obtuvo haciendo clic con el botón derecho sobre el elemento product y seleccionando Mostrar atributos con nombre dinámico en el menú contextual.

mf_dynamic_attributes

Fig.4        Nombres de nodo dinámicos habilitados (para atributos)

Para restaurar el modo estándar del componente, haga clic con el botón derecho en el nodo product y desactive el comando Mostrar atributos con nombre dinámico en el menú contextual.

 

Como se ilustra en Fig. 3 y Fig. 4, el componente cambia de aspecto cuando cualquier nodo (en este caso, product) se cambia al modo «nombre de nodo dinámico». Este nuevo aspecto ofrece las siguientes posibilidades:

 

Leer o escribir una lista de todos los elementos secundarios o atributos de un nodo. Estos vienen dados por element() o attribute(), respectivamente.

Leer o escribir el nombre de cada elemento secundario o atributo. El nombre viene dado por los elementos node-name() y local-name().

Si se trata de elementos, leer o escribir el valor de cada elemento secundario, en el tipo de datos que corresponda. Este valor lo proporciona el nodo de conversión de tipo (en este caso, el elemento text()). Recuerde que solamente los elementos pueden tener nodos de conversión de tipo. Los atributos siempre se tratan como tipo «string».

Agrupar o filtrar los elementos secundarios por nombre.

 

A continuación se describen los tipos de nodos con los que puede trabajar en el modo «nombre de nodo dinámico».

 

element()

Este nodo tiene diferentes comportamientos, dependiendo de si está en el componente de origen o en el componente de destino. Si está en el componente de origen, aporta los elementos secundarios del nodo en forma de secuencia. En la figura 3, element() proporciona una lista (secuencia) de todos los elementos secundarios de product. Por ejemplo, la secuencia que se crea a partir de este XML contendría tres elementos (porque product tiene tres elementos secundarios):

 

  <product>

    <id>1</id>

    <color>red</color>

    <size>10</size>

  </product>

 

Observe que el nombre y el tipo de cada elemento de la secuencia es el que nos da el nodo node-name() y el nodo de conversión de tipo respectivamente. Imagine que necesita pasar datos de un archivo XML a otro XML de destino de la siguiente manera:

mff_genericnodes_01

Fig.6        Asignación de nombres de elementos XML a valores de atributos (requisito)

Para conseguir este objetivo debemos diseñar esta asignación de datos:

mf_map_ConvertProducts_04

Fig.7        Asignación de nombres de elementos XML a valores de atributos (en MapForce)

El papel que element() desempeña aquí es aportar la secuencia de elementos secundarios de product, mientras que node-name() y text() aportan el nombre y el valor real de cada elemento de la secuencia. Esta asignación va acompañada de un tutorial de ejemplo y se explica con más detalle en el apartado Ejemplo: asignar nombres de elemento a valores de atributo.

 

En el componente de destino element() no crea nada por sí mismo, lo cual constituye una excepción de la regla básica de asignación (por cada elemento del origen, crear un elemento de destino). Los elementos propiamente dichos los crean los nodos de conversión de tipo (usando el valor de node-name()) y por los nodos de prueba de nombre (usando su propio nombre).

 

attribute()

Como puede verse en la figura 4, este elemento permite acceder a todos los atributos del nodo en tiempo de ejecución de la asignación. En un componente de origen aporta, en forma de secuencia, los atributos del nodo de origen que está conectado. Por ejemplo, en este archivo XML, la secuencia incluiría dos elementos (porque product tiene dos atributos):

 

  <product id="1" color="red" />

 

Observe que el nodo attribute() solo aporta el valor de cada atributo en la secuencia, siempre como tipo string. El nombre de cada atributo viene dado por el nodo node-name().

 

En un componente de destino este nodo procesa una secuencia conectada y crea un valor de atributo por cada elemento de la secuencia. El nombre de atributo viene dado por node-name(). Por ejemplo, imagine que necesita pasar datos de un archivo XML a otro archivo XML de la siguiente manera:

mff_genericnodes_02

Fig. 8        Asignación de valores de atributos a nombres de atributos (requisito)

Para conseguir este objetivo debemos diseñar esta asignación de datos:

mff_genericnodes_02c

Fig. 9        Asignación de valores de atributos a nombres de atributos (en MapForce)

Nota: Esta transformación también es posible sin habilitar el acceso dinámico a los atributos de un nodo. Aquí solo se ilustra cómo funciona attribute() en un componente de destino.

 

Si quiere reconstruir esta asignación, tenga en cuenta que usa los mismos componentes XML que la asignación ConvertProducts.mfd de la carpeta <Documentos>\Altova\MapForce2026\MapForceExamples\Tutorial\. La única diferencia es que el destino ahora es el origen y el origen ahora es el destino. Como datos de entrada del componente de origen deberá utilizar una instancia XML que contenga valores de atributo, por ejemplo:

 

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <attribute name="id" value="1"/>
    <attribute name="color" value="red"/>
    <attribute name="size" value="big"/>
  </product>
</products>

 

Tenga en cuenta que, en el código anterior, se han omitido la declaración del espacio de nombres y el esquema para simplificar.

 

node-name()

En un componente de origen node-name() aporta el nombre de cada elemento secundario de element() o el nombre de cada atributo de attribute() respectivamente. Por defecto el nombre que aporta es de tipo xs:QName. Para obtener el nombre como tipo string, debe utilizarse el nodo local-name() (ver figura 3) o utilice la función QName-as-string.

 

En un componente de destino node-name() escribe el nombre de cada elemento o atributo que exista en element() o attribute().

 

local-name()

Este nodo funciona de la misma manera que node-name(), con la diferencia de que el tipo es xs:string en lugar de xs:QName.

 

Nodo de conversión de tipo

En un componente de origen, el nodo de conversión de tipos proporciona el valor de cada elemento secundario contenido en element(). El nombre y la estructura de este nodo dependerá del tipo qeu esté seleccionado en el cuadro de diálogo Configuración de secundarios con nombre dinámico (figura 2).

 

Para cambiar el tipo del nodo haga clic en el botón Cambiar selección (mf_ic_change_selection) y seleccione un tipo de la lista de tipos disponibles, incluido el comodín de esquema (xs:any). Consulte Obtener acceso a determinado tipo de nodos para obtener más información.

 

En un componente de destino el nodo de conversión de tipo escribe el valor de cada elemento secundario que incluye element(), en el tipo de datos correspondiente. El tipo de datos deseado se selecciona haciendo clic en el botón Cambiar selección (mf_ic_change_selection).

 

Nodos de prueba de nombre

En un componente de origen, los nodos de prueba de nombre permiten agrupar o filtrar elementos secundarios de una instancia de origen por nombre. Puede que tenga que filtrar los elementos secundarios por nombre para garantizar que la asignación acceda a los datos de la instancia utilizando el tipo correcto (consulte Obtener acceso a determinado tipo de nodos).

 

En general, los nodos de prueba de nombre funcionan casi como nodos de elementos normales para leer y escribir valores y estructuras de subjerarquías. Sin embargo, como la semántica de la asignación es distinta cuando está habilitado el acceso dinámico, existen algunas restricciones. Por ejemplo, no se puede concatenar el valor de dos nodos de prueba de nombre.

 

En un componente de destino los nodos de prueba de nombre crean tantos elementos en el resultado como elementos existen en la secuencia de origen conectada. Su nombre reemplaza el valor que esté asignado a node-name().

 

Si es necesario, puede ocultar los nodos de prueba de nombre en el componente. Para ello, haga clic en el botón Cambiar selección (mf_ic_change_selection) situado junto al nodo element(). Después, en el cuadro de diálogo Configuración de secundarios con nombre dinámico (Fig. 2), desactive la casilla Mostrar nodos de prueba de nombre.

© 2019-2025 Altova GmbH