Acceso a los atributos de los mensajes XML

Los mensajes XML constan de una secuencia de elementos con formato y contenido delimitada por códigos. Muchos códigos XML incluyen también información sobre el formato de los atributos asociados. En el árbol el valor del elemento y los atributos que pueda tener el elemento se tratan como hijos del elemento.

La tabla siguiente lista el nombre de la correlación que debe utilizar para consultar los atributos.

Elemento de sintaxis Nombre de la correlación
Atributo (XML.Attribute) - (XML.attr) también está soportado
En el ejemplo del mensaje Invoice, el elemento Title de cada elemento Item tiene tres atributos: Category, Form y Edition. Por ejemplo, el primer elemento Title contiene:
<Title Category="Computer" Form="Paperback" Edition="2">The XML Companion</Title>

Elemento InputRoot.XML.Invoice.Purchases.Item[1].Title tiene cuatro hijos en el árbol lógico: Category, Form, Edition y el valor del elemento que es "The XML Companion".

Si desea acceder a los atributos de este elemento, puede codificar el ESQL siguiente. Este extracto de código recupera los atributos del mensaje de entrada y los crea como elementos del mensaje de salida. No procesa el valor del elemento de este ejemplo.

-- Establecer el cursor en el primer elemento XML.Attribute de Title, tenga en cuenta el * después de
-- (XML.Attribute) que significa cualquier nombre, ya que éste puede ser conocido

DECLARE cursor REFERENCE TO InputRoot.XML.Invoice.Purchases.Item[1].Title.(XML.Attribute)*;

WHILE LASTMOVE(cursor) DO

   -- Crear un campo con el mismo nombre que XML.Attribute y establecer su valor
   -- en el valor de XML.Attribute

   SET OutputRoot.XML.Data.Attributes.{FIELDNAME(cursor)} = FIELDVALUE(cursor);

-- Ir al igual siguiente del mismo TYPE para evitar el valor de Title
-- que no es un XML.Attribute

   MOVE cursor NEXTSIBLING REPEAT TYPE;
END WHILE;

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

<Data>
  <Attributes>
    <Category>Computer</Category>
    <Form>Paperback</Form>
    <Edition>2</Edition>
  </Attributes>
</Data>
También puede utilizar una sentencia SELECT:
SET OutputRoot.XML.Data.Attributes[] =
    (SELECT FIELDVALUE(I.Title)                           AS title,
            FIELDVALUE(I.Title.(XML.Attribute)Category)   AS category,
            FIELDVALUE(I.Title.(XML.Attribute)Form)       AS form,
            FIELDVALUE(I.Title.(XML.Attribute)Edition)    AS edition
     FROM InputRoot.XML.Invoice.Purchases.Item[] AS I);
Esto genera el mensaje de salida siguiente:
<Data>
  <Attributes>
    <title>The XML Companion</title>
    <category>Computer</category>
    <form>Paperback</form>
    <edition>2</edition>
  </Attributes>
  <Attributes>
    <title>A Complete Guide to DB2 Universal Database</title>
    <category>Computer</category>
    <form>Paperback</form>
    <edition>2</edition>
  </Attributes>
  <Attributes>
    <title>JAVA 2 Developers Handbook</title>
    <category>Computer</category>
    <form>Hardcover</form>
    <edition>0</edition>
  </Attributes>
</Data>

Puede calificar la sentencia SELECT con una sentencia WHERE para filtrar los resultados y obtener el mismo mensaje de salida que el que genera la sentencia WHILE. Este segundo ejemplo muestra que puede crear los mismos resultados con menos ESQL y de menor complejidad.

SET OutputRoot.XML.Data.Attributes[] =
    (SELECT FIELDVALUE(I.Title.(XML.Attribute)Category)   AS category,
            FIELDVALUE(I.Title.(XML.Attribute)Form)       AS form,
            FIELDVALUE(I.Title.(XML.Attribute)Edition)    AS edition
     FROM InputRoot.XML.Invoice.Purchases.Item[] AS I
     WHERE I.Title = 'The XML Companion');
Esto genera el mensaje de salida siguiente:
<Data>
  <Attributes>
    <Category>Computer</Category>
    <Form>Paperback</Form>
    <Edition>2</Edition>
  </Attributes>
</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