# XForms/Listas de Selección a partir de archivos
## Motivacion

Las personas que diseñan formularios frecuentemente tienen que mantener muchas tablas de código. dichas tablas de código pueden cambiar frecuentemente o puede haber también procesos de actualización de bases de datos centralizadas. Así que quieres que cada formulario dinámicamente obtenga el contenido de datos de un archivo XML o de un servicio web.
Este programa de ejemplo demuestra cómo leer una lista de códigos con etiquetas directamente de un archivo o servicio web. En este ejemplo el archivo que contiene los códigos es simplemente un archivo XML bien formado en el mismo directorio que el formulario.

## Enlace a la aplicación funcionando

Nota: no soy el autor original de este ejemplo solamente lo tomo con fines ilustrativos. Lista de selección a partir de archivos

## Cargando una instancia de XML de un archivo local o un servicio web

El siguiente fragmento de código usualmente ubicado en la etiqueta HTML "head", demuestra cómo leer datos XML desde un archivo en el mismo directorio que el formulario usando el atributo "src" de la instancia.

### Cargando datos de un servicio web

Es común tener en un solo servicio cargadas todas las tablas de datos. A este servicio se le pueden pasar parámetros tales como el nombre de la tabla de datos, así como una persona es parte de un grupo. Esto puede reducir la lista de opciones para listas largas.

### Cargando todos los datos en una sola instancia

El problema de cargar códigos individualmente en instancias individuales es que debes realizar un get HTTP por cada una de las tablas de datos. Esto no es un problema para formularios con una o dos listas de selección pequeñas. Pero para formularios largos con muchas listas de selección estos get pueden retrasar el tiempo de respuesta del formulario. La solución es cargar todas las tablas en una sola instancia con una sola solicitud get HTTP. Cada tabla de datos puede ser entonces seleccionada de esta instancia.
En este segundo ejemplo todos los datos en el formulario completo estan siendo generados por un sevicio del Registro de Metadatos (MDR por la sigla en inglés). Los datos retornados por este servidor son una colección de códigos para cada control de selección del formulario.
Esto buscará por un archivo XML bien formado en el directorio actual y lo cargará en la instancia del modelo.
Nótese que en este caso al modelo se le da un id. Esto es necesario para permitir que múltiples tablas de datos sean leídas en su propio y separado modelo.

## Previsualización

El usuario selecciona el valor de la lista desplegable. El valor en la salida es actualizado inmediatamente.
Notese que la etiqueta en la imagen no es la misma que en el esquema.

## Extrayendo datos de un XML REST webservice

Se puede reemplazar el atributo src con una ruta directamente a un servicio web XML REST. por ejemplo, si se ponen todas las tablas de datos en los recursos de un proyecto, la ruta luciría como así:
o si los datos del sistemas están almacenados en un solo archivo XML y se tiene un wrapper XQuery or if your system codes are stored in a single XML file and you have a wrapper XQuery

## Listas de seleccion a partir de una sola instancia

para mantener los formulario rapidos, usualmente es mejor hacer una sola operacion HTTP GET para todos los datos. Los formularios que tienen varias listas de seleccion, tomaran mas tiempo para cargar si cada una de las listas realiza una operacion HTTP GET. Para grandes formularios es facil obtener una mejora de velocidad de 10x en tiempos de cargado.

### Estructura de instacia de tablas de datos

El siguiente es un ejemplo de la estructura de todos los datos cargados en una sola instancia

### Ejemplo Select1

una vez los datos están cargados en el modelo, cada uno de los controles de select pueden obtener sus datos directamente desde el modelo usando el elemento <xf:itemset>. Itemset trabaja igual que Repeat y usa nodeset (no usa ref) para obtener todos sus valores. Acá hay un ejemplo de como obtener el conjunto de datos desde la instancia de tabla de datos.
Notese que el predicado [code-table-name='MyElementCode'] pondra unicamente los elementos para ese código en la lista de selección.