Transformando uma Mensagem XML Simples

Ao codificar o ESQL para um nó Compute, utilize a instrução SELECT para transformar mensagens simples.

Exemplos

Reveja os exemplos a seguir e modifique-os para utilização. Todos eles têm como base a mensagem Invoice como entrada.

Considere o seguinte ESQL:

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

Quando a mensagem Invoice for processada por este ESQL, será produzida a seguinte mensagem de saída:

<Dados>
     <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>

Existem três campos de Saída, um para cada campo Item. Isto ocorre porque, por padrão, SELECT cria um item em sua lista de resultados para cada item descrito por sua lista FROM. Dentro de cada campo de Saída, existe um Campo para cada campo nomeado na cláusula SELECT e eles estão na ordem na qual são especificados dentro da SELECT, não na ordem em que aparecem na mensagem que chega.

O "R" apresentado pela palavra-chave AS final é conhecido como um nome de correlação. É uma variável local que representa, por sua vez, cada um dos campos endereçados pela cláusula FROM. Não existe significado para o nome escolhido. Em resumo, esta transformação simples faz duas coisas:

  1. Descarta campos indesejados.
  2. Garante a ordem dos campos.

Aqui está a mesma transformação implementada por um algoritmo de procedimento:

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;

Esses exemplos mostram que a versão SELECT da transformação é muito mais concisa. Ela também tem execução mais rápida.

O exemplo a seguir mostra uma transformação mais avançada:

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

Nesta transformação, existe uma cláusula AS associada a cada item na cláusula SELECT. Isto fornece a cada campo no resultado um nome explícito em vez dos nomes de campos serem herdados da entrada. Estes nomes podem ser caminhos (ou seja, uma lista de nomes separados por ponto), conforme mostrado no exemplo. Assim, a estrutura da mensagem de saída pode ser arbitrariamente diferente da estrutura da mensagem de entrada. Utilizando a mesma mensagem Invoice, o resultado será:

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

As expressões na cláusula SELECT podem ter qualquer complexidade e não existem restrições especiais. Elas podem incluir operadores, funções, literais e podem referir-se a variáveis ou a campos não relacionados ao nome de correlação. O exemplo a seguir mostra expressões mais complexas:

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 a mesma mensagem Invoice, o resultado, nesse caso, será:

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

Conforme mostrado acima, as cláusulas AS da cláusula SELECT contêm um caminho que descreve o nome completo do campo a ser criado no resultado. Estes caminhos também especificam (pois é normal para caminhos) o tipo de campo a ser criado. A transformação de exemplo a seguir especifica os tipos de campos. Nesse caso, os dados ativados de XML são transformados em atributos de 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 a mesma mensagem Invoice, o resultado será:

<Dados>
    <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, uma cláusula WHERE pode ser utilizada para eliminar alguns dos resultados. No exemplo a seguir, uma cláusula WHERE é utilizada para remover os resultados nos quais um critério específico é atendido. Um resultado inteiro é incluído ou excluído:

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 a mesma mensagem de entrada, o resultado será:

<Dados>
    <Output>
    <Manual>
          <Quantity>2</Quantity>
     <Author>Neil Bradley</Author>
    </Manual>
    </Output>
</Data>
Conceitos relacionados
Visão Geral de Fluxos de Mensagens
Visão Geral do ESQL
Modelagem de Mensagens
Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Gerenciando Arquivos ESQL
Referências relacionadas
Nó Compute
Nó Database
Nó Filter
Referência de ESQL
Função CARDINALITY
Instrução DECLARE
Função SELECT
Instrução SET
Instrução WHILE
Mensagem de Exemplo
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak05740_