Utilizzo degli elementi di tipo xsd:: list

La specifica dello schema XML consente ad un elemento o attributo di contenere un elenco di valori in base ad un tipo semplice con i valori singoli separati da spazi.

Considerare il seguente messaggio di input XML:
   <message1>
     <listE1 listAttr="one two three"> four five six</listE1>
   </message1> 

Nella struttura ad albero del messaggio risultanti, un tipo xsd::list è rappresentato come un nodo del nome con un child di valore anonimo per ciascun elemento di elenco. Ciò consente di gestire gli elenchi ripetuti senza perdita di informazioni.

Gli elenchi ripetuti sono visualizzati come elementi di nome sibling, ciascuno dei quali ha i propri nodi child di valore anonimo per le rispettive voci di elenco. Il messaggio di esempio precedente produce la seguente struttura ad albero logica:
   MRM
	   	listEl  (Name)
		     	listAttr (Name)
			        "one"   (Value)
			        "two"   (Value) 
			        "three" (Value)
		       "four" (Value)
		       "five" (Value)
		       "six"  (Value)
E' possibile accedere alle singole voci di elenco come ElementName.*[n]. Ad esempio:
  SET OutputRoot.MRM.listEl.listAttr.*[3] = ...
modifica la terza voce di listAttr.

Associazione tra un elenco ed un elemento ripetuto

Considerare il formato del seguente messaggio di input XML:
   <MRM>
     <inner>abcde fghij 12345</inner>
   </MRM> 
in cui l'elemento interno è di tipo xsd::list, per cui ad esso sono associati tre valori stringa e non un valore singolo.
Se si desidera copiare i tre valori in un messaggio di output, in cui ciascun valore è associato ad un'istanza di elementi ripetuti come riportato di seguito:
   <MRM>
     <str1>abcde</str1>
     <str1>fghij</str1>
     <str1>12345</str1>
   </MRM> 
è ragionevole supporre che la seguente sintassi ESQL funzioni correttamente:
   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;
Tuttavia, l'istruzione:
   SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
richiede una copia della struttura ad albero dall'origine alla destinazione. Poiché l'elemento di destinazione non esiste ancora, viene creato ed i relativi valore e tipo vengono impostati dall'origine.

Ciò è congruente con il funzionamento di ESQL in altri punti, ma nel caso di elementi che hanno valori di tipo list, tale codice può determinare errori di convalida.

Per evitare questo problema, utilizzare la Funzione FIELDVALUE per richiamare in modo esplicito solo il valore dell'elemento di origine, come riportato di seguito:
      SET OutputRoot.MRM.str1[M] = FIELDVALUE(InputBody.inner.*[M]);
Attività correlate
Sviluppo di ESQL
Accesso agli elementi nel contenuto del messaggio
Riferimenti correlati
Istruzione SET
Funzione FIELDVALUE
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak05141_