Cómo trabajar con elementos de tipo xsd:: list

La especificación de esquema XML permite que un elemento o atributo contenga una lista de valores basándose en un tipo simple con los valores individuales separados por espacios en blanco.

Observe el mensaje de entrada XML siguiente:
   <message1>
     <listE1 listAttr="one two three"> four five six</listE1>
   </message1> 

En el árbol de mensaje resultante, se representa un tipo xsd::list como un nodo de nombre con un hijo de valor anónimo para cada elemento de la lista. Esto permite manejar las listas de repetición sin ninguna pérdida de información.

Las listas de repetición aparecen como elementos de nombre hermanos, cada uno de los cuales tiene sus propios nodos hijo de valor anónimo para sus elementos de lista respectivos. El mensaje de ejemplo anterior genera el siguiente árbol lógico:
   MRM
	   	listEl  (Name)
		     	listAttr (Name)
			        "one"   (Value)
			        "two"   (Value) 
			        "three" (Value)
		       "four" (Value)
		       "five" (Value)
		       "six"  (Value)
Puede accederse a los elementos individuales de la lista como ElementName.*[n]. Por ejemplo,
  SET OutputRoot.MRM.listEl.listAttr.*[3] = ...
modifica el tercer elemento de listAttr.

Correlación entre una lista y un elemento de repetición

Observe el formato del mensaje de entrada XML siguiente:
   <MRM>
     <inner>abcde fghij 12345</inner>
   </MRM> 
donde el elemento inner es del tipo xsd::list, por lo que tiene tres valores de serie de caracteres asociados, en lugar de un solo valor.
Si desea copiar los tres valores en un mensaje de salida, donde cada valor está asociado a una instancia de elementos de repetición, de la manera siguiente:
   <MRM>
     <str1>abcde</str1>
     <str1>fghij</str1>
     <str1>12345</str1>
   </MRM> 
es razonable suponer que la siguiente sintaxis ESQL funciona:
   DECLARE D INTEGER;
   SET D = CARDINALITY(InputBody.str1.*[]);
   DECLARE M INTEGER 1;
   WHILE M <= D DO
      SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
      SET M = M + 1;
   END WHILE;
Sin embargo, la sentencia:
   SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
requiere una copia de árbol, del origen al destino. Se crea el elemento de destino, puesto que todavía no existe, y su valor y tipo se establecen desde el origen.

Esto es coherente con el comportamiento de ESQL en otros sitios, pero en el caso de elementos que tienen valores del tipo list, este código puede generar errores falsos de validación.

Para evitar este problema, se recomienda utilizar la Función FIELDVALUE para recuperar explícitamente sólo el valor del elemento origen, de la manera siguiente:
      SET OutputRoot.MRM.str1[M] = FIELDVALUE(InputBody.inner.*[M]);
Tareas relacionadas
Desarrollo de ESQL
Acceder a elementos en el cuerpo del mensaje
Referencia relacionada
Sentencia SET
Función FIELDVALUE
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05141_