Transformación de un mensaje XML sencillo

Cuando codifique ESQL para un nodo Compute, utilice la sentencia SELECT para la transformación de mensajes sencillos.

Ejemplos

Revise los ejemplos siguientes y modifíquelos para su propio uso. Todos se basan en el mensaje Invoice como entrada.

Examine 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 produce el siguiente mensaje de salida:

<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 de salida (Output), uno por cada campo de Elemento (Item). Esto se debe a que, por omisión, SELECT crea un elemento en su lista de resultados por cada elemento descrito por su lista FROM. En cada campo Output, hay un campo para cada campo mencionado en la cláusula SELECT, y están en el orden en que se especifican en SELECT, no en el orden en que aparecen en el mensaje entrante.

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

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

Ésta 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 más deprisa.

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 campo se hereden de la entrada. Estos nombres pueden ser vías de acceso (es decir, una lista de nombres separada por puntos), tal como se muestra en el ejemplo. Así pues, la estructura del mensaje de salida puede ser diferente, de manera arbitraria, de la del mensaje de entrada. Utilizando 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 ser de cualquier complejidad y no hay limitaciones especiales. Pueden incluir operadores, funciones, literales y pueden hacer referencia a variables o a campos no 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 es, en este caso:

<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 pueden especificar (como es normal en las vías de acceso) el tipo de campo que se va a crear. El ejemplo de transformación siguiente especifica los tipos de campo. En este caso, los datos codificados de XML 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
    );

Utilizando 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 resultados. En el ejemplo siguiente, se utiliza una cláusula WHERE para eliminar los resultados en los que se cumple un criterio determinado. Se incluye o se excluye un resultado entero:

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 es:

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

Conceptos relacionados
Flujos de mensajes
ESQL
Diseño de mensajes

Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Gestión de archivos ESQL

Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Función CARDINALITY
Sentencia DECLARE
Función SELECT
Sentencia SET
Sentencia WHILE
Mensaje de ejemplo