Ejemplo: agrupar y filtrar nodos según su nombre
Este ejemplo demuestra cómo diseñar una asignación que lee pares de clave/valor de una lista de propiedades XML (o XML plist) y los escribe en un archivo CSV. Las listas de propiedades XML permiten almacenar información de objetos OS X e iOS en formato XML (véase https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html.) Este ejemplo viene acompañado de un diseño de asignación: <Documentos>\Altova\MapForce2025\MapForceExamples\Tutorial\ReadPropertyList.mfd.
A continuación podemos ver un fragmento de código del archivo XML de origen.
<?xml version="1.0" encoding="UTF-8"?> |
El objetivo de la asignación es crear una línea nueva en el archivo CSV a partir de ciertos pares de clave/valor del nodo <dict> del archivo de lista de propiedades. Concretamente, la asignación solamente filtrará los pares <key> - <string> y el resto de pares clave/valor (p. ej. <key> - <integer>) se pasarán por alto. En el archivo CSV la nueva línea debe almacenar el nombre de la propiedad, separado del valor de la propiedad por una coma. En otras palabras, el resultado de la asignación debe tener este aspecto:
First Name,William Last Name,Shakespeare Profession,Playwright |
Para conseguir el objetivo de la asignación será necesario tener acceso dinámico a los nodos secundarios del nodo dict. Además, necesitaremos la función group-starting-with para agrupar los pares de clave/valor recuperados del archivo XML. Y, por último, deberemos usar un filtro para filtrar los nodos cuyo nombre sea "string".
A continuación explicamos cómo diseñar esta asignación paso a paso.
Paso nº1: agregar el componente XML de origen a la asignación
1.Elija el lenguaje de transformación integrado (véase Seleccionar un lenguaje de transformación).
2.En el menú Insertar haga clic en el comando Archivo o esquema XML y navegue hasta el archivo <Documentos>\Altova\MapForce2025\MapForceExamples\Tutorial\plist.xml. Este archivo XML apunta al esquema plist.xsd que está situado en la misma carpeta.
Paso nº2: agregar el componente CSV de destino a la asignación
1.En el menú Insertar haga clic en el comando Archivo de texto. Ahora seleccione la opción Utilizar procesamiento básico para archivos CSV... en el cuadro de diálogo.
2.Añada un campo CSV más al componente con el botón Anexar campo.
3.Haga doble clic en el nombre de cada campo e introduzca Key para el nombre del primer campo y Value para el nombre del segundo. El campo Key almacenará el nombre de la propiedad, mientras que el campo Value almacenará su valor. Consulte la sección Archivos CSV y archivos de texto para obtener más información.
Paso nº3: agregar el filtro y funciones
1.Arrastre las funciones equal, exists y group-starting-with desde la ventana Bibliotecas hasta el área de asignación (véase Funciones básicas).
2.Para agregar el filtro haga clic en el menú Insertar y seleccione el comando Filtro: nodos/filas (véase Filtros y condiciones).
3.En el menú Insertar seleccione el comando Constante e introduzca el texto "string".
4.En el componente de origen haga clic con el botón derecho en el nodo dict y seleccione Mostrar elementos secundarios con nombre dinámico en el menú contextual. En el cuadro de diálogo que aparece compruebe que la casilla Mostrar nodos de prueba para filtrar o crear elementos... está marcada.
5.Dibuje las conexiones que aparecen en la imagen siguiente.
ReadPropertyList.mfd
Funcionamiento de la asignación
El elemento element() del componente de origen suministra todos los secundarios del nodo dict en forma de secuencia a la función group-starting-with. La función group-starting-with crea un grupo nuevo cada vez que se detecta un nodo llamado key. La función exists comprueba si se cumple esta condición y devuelve el valor binario true/false a la función de agrupación.
Por cada grupo el filtro comprueba si el nombre del nodo actual equivale a "string" (con ayuda de la función equal). El nombre propiamente dicho se lee de local-name(), que suministra el nombre del nodo en forma de cadena.
Las conexiones con el componente de destino se encargan de lo siguiente:
•Cuando la condición de filtrado se cumple, entonces se crea una fila nueva en el componente CSV de destino.
•Key (nombre de la propiedad) se toma del valor del elemento key del componente de origen.
•Value (valor de la propiedad) se toma del nodo de prueba string.