Transformación de un mensaje XML sencillo

Cuando codifique ESQL para un nodo Compute, utilice la sentencia SELECT para transformar mensajes sencillos.

Ejemplos

Revise los ejemplos siguientes y modifíquelos para utilizarlos como desee. Todos están basados en el mensaje Invoice como entrada.

Observe el ESQL siguiente:

 SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);

Cuando este ESQL procesa el mensaje Invoice, se genera el mensaje de salida siguiente:

<Data>
  <Output>
     <Quantity>2</Quantity>
     <Autho>Neil Bradley</Autho>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Autho>Don Chamberlin</Autho>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Autho>Philip Heller, Simon Roberts</Autho>
  </Output>
</Data>

Hay tres campos Output, uno para cada campo Item. Esto es debido a que, por omisión, SELECT crea un elemento en su lista de resultados para cada elementos que describe su lista FROM. En cada campo Output, hay un Field para cada campo nombrado en la cláusula SELECT y estos están en el orden en que se especifican dentro de SELECT, no en el orden en el que aparecen en el mensaje de entrada.

La R introducida por la palabra clave AS final se conoce como un nombre de correlación. Es una variable local que representa a su vez cada uno de los campos tratados por la cláusula FROM. El nombre elegido no tiene ninguna importancia. En resumen, esta sencilla transformación realiza dos cosas:

  1. Descarta los campos no deseados.
  2. Garantiza el orden de los campos.

Esta es la misma transformación implementada por un algoritmo de procedimiento:

DECLARE i INTEGER 1;
DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]);

WHILE (i <= count)
   SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity;
   SET OutputRoot.XML.Data.Output[i].Author   = InputRoot.XML.Invoice.Purchases.Item[i].Author;
   SET i = i+1;
END WHILE;

Estos ejemplos muestran que la versión SELECT de la transformación es mucho más concisa. También se ejecuta con más rapidez.

El ejemplo siguiente muestra una transformación más avanzada:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author 
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

En esta transformación, hay una cláusula AS asociada a cada elemento de la cláusula SELECT. Esto proporciona a cada campo del resultado un nombre explícito en lugar de que los nombres de campos se hereden de la entrada. Estos nombres pueden ser vías de acceso (esto es, una lista de nombres separados por punto), como se muestra en el ejemplo. De este modo, la estructura del mensaje de salida puede ser arbitrariamente diferente del mensaje de entrada. Al utilizar el mismo mensaje Invoice, el resultado es:

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>

<Data>
  <Output>
    <Book>
      <Quantity>2</Quantity>
      <Author>Neil Bradley</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Don Chamberlin</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Philip Heller, Simon Roberts</Author>
    </Book>
  </Output>
</Data> 

Las expresiones de la cláusula SELECT pueden tener cualquier nivel de complejidad y no tienen limitaciones especiales. Pueden incluir operadores, funciones, literales y pueden hacer referencia a variables o campos que no están relacionados con el nombre de correlación. El ejemplo siguiente muestra expresiones más complejas:

SET OutputRoot.XML.Data.Output[] =
    (SELECT 'Start'                          AS Header,
            'number of books:' || R.Quantity AS Book.Quantity, 
            R.Author || ':Name and Surname'  AS Book.Author,
            'End'                            AS Trailer
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

Utilizando el mismo mensaje Invoice, el resultado de este caso es:

<Data>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:2</Quantity>
   <Author>Neil Bradley:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Don Chamberlin:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Philip Heller, Simon Roberts:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
</Data>

Como se ha mostrado anteriormente, las cláusulas AS de la cláusula SELECT contienen una vía de acceso que describe el nombre completo del campo que se va a crear en el resultado. Estas vías de acceso también especifican (como suele ser lo normal para vías de acceso) el tipo del campo que se va a crear. La siguiente transformación de ejemplo especifica los tipos de campo. En este caso, los datos XML codificados se transforman en atributos XML:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, 
            R.Author.*   AS Book.(XML.Attribute)Author
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

Al utilizar el mismo mensaje Invoice, el resultado es:

<Data>
 <Output>
  <Book Quantity="2" Author="Neil Bradley"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Don Chamberlin"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Philip Heller, Simon Roberts"/>
 </Output>
</Data>

Finalmente, puede utilizar una cláusula WHERE para eliminar algunos de los resultados. En el ejemplo siguiente se utiliza una cláusula WHERE para suprimir los resultados en los que se cumple un criterio específico. Se incluye o excluye un resultado completo:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
            WHERE R.Quantity = 2
     );

Utilizando el mismo mensaje de entrada, el resultado será:

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>
Conceptos relacionados
Visión general de flujos de mensajes
Visión general de ESQL
Modelado de mensajes
Tareas relacionadas
Diseñar un flujo de mensajes
Definir el contenido del flujo de mensajes
Gestión de archivos ESQL
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Referencia de ESQL
Función CARDINALITY
Sentencia DECLARE
Función SELECT
Sentencia SET
Sentencia WHILE
Mensaje de ejemplo
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05740_