Trabalhando com Elementos de Tipo xsd:: list

A especificação do Esquema XML permite que um elemento ou atributo contenha uma lista de valores baseados em um tipo simples com os valores individuais separados por um espaço em branco.

Considere a seguinte mensagem de entrada XML:
   <message1>
     <listE1 listAttr="one two three"> four five six</listE1>
   </message1> 

Na árvore de mensagens resultante, um tipo xsd::list é representado como um nome do nó com um filho de valor anônimo para cada item da lista. Isto permite que listas de repetição sejam manipuladas sem perda de informações.

As listas de repetição aparecem como elementos de nomes irmãos, cada um tendo seus próprios nós-filhos de valor anônimo para seus respectivos itens da lista. A mensagem de exemplo precedente produz a seguinte árvore lógica:
   MRM
	   	listEl  (Name)
		     	listAttr (Name)
			        "one"   (Value)
			        "two"   (Value)
			        "three" (Value)
		       "four" (Value)
		       "five" (Value)
		       "six"  (Value)
Os itens da lista individuais podem ser acessados como ElementName.*[n]. Por exemplo:
  SET OutputRoot.MRM.listEl.listAttr.*[3] = ...
modifica o terceiro item de listAttr.

Mapeamento entre uma Lista e um Elemento de Repetição

Considere o formato da seguinte mensagem de entrada XML:
   <MRM>
     <inner>abcde fghij 12345</inner>
   </MRM>
em que o elemento interno é de tipo xsd::list, portanto, ele possui três valores de cadeia associados, em vez de um valor único.
Se desejar copiar os três valores para uma mensagem de saída, em que cada valor é associado a uma instância de elementos de repetição, conforme a seguir:
   <MRM>
     <str1>abcde</str1>
     <str1>fghij</str1>
     <str1>12345</str1>
   </MRM>
será aceitável assumir que a seguinte sintaxe 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;
No entanto, a instrução:
   SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
solicita uma cópia da árvore da origem para o destino. Como o elemento de destino ainda não existe, ele será criado e seu valor e tipo serão configurados a partir da origem.

Isto é consistente com o comportamento do ESQL em outro lugar mas, no caso de elementos que possuem valores de tipo list, este código pode produzir erros de validação falsos.

Para evitar este problema, é recomendável utilizar o Função FIELDVALUE para recuperar explicitamente apenas o valor do elemento de origem, da seguinte forma:
      SET OutputRoot.MRM.str1[M] = FIELDVALUE(InputBody.inner.*[M]);
Tarefas relacionadas
Desenvolvendo ESQL
Acessando Elementos no Corpo da Mensagem
Referências relacionadas
Instrução SET
Função FIELDVALUE
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak05141_