“Qualified” y “Unqualified” esquemas

En ocasiones cuando procesamos mensajes en nuestras aplicaciones de integración encontramos que algunas acciones especificadas como mapas de transformación o asignaciones xpath() no son ejecutadas como se esperan, después de revisar los esquemas de definición y los mensajes definidos no encontramos aparente lógica en la causa del error ya que los nombres de nodos (xsd:element), atributos (xsd:attribute) y nombres de espacios (xsd:xmlns) utilizados están correctos.

Cuando surgen estos problemas es importante revisar la especificación XSD construida y el mensaje que se esta ingresando al proceso de integración. Específicamente revisar los conceptos "qualified" y "unqualified" definidos en los atributos elementFormDefault y attributeFormDefault en el esquema, ¿por que?, estos dos conceptos definen el como se pueden localizar los elementos (como nodos y atributos) dentro del mensaje por medio de las expresiones xpath utilizadas tanto en el mapa de transformación como en la función xpath() .

Supongamos la siguiente definición de esquema:

<xs:schema xmlns:b="https://schemas.microsoft.com/BizTalk/2003" xmlns="https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema" elementFormDefault="qualified" targetNamespace="https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema" xmlns:xs="https://www.w3.org/2001/XMLSchema">   <xs:element name="Root">      <xs:complexType>         <xs:sequence>            <xs:element name="Record">               <xs:complexType>                  <xs:sequence>                     <xs:element name="Field" type="xs:string" />                   </xs:sequence>               </xs:complexType>            </xs:element>         </xs:sequence>      </xs:complexType>   </xs:element></xs:schema>

Como se observa se define el atributo elementFormDefault="qualified" , esto significa que todos los elementos dentro del mensaje que implemente esta estructura deberán de estar marcados con el nombre de espacio definido https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema, de esta forma el siguiente mensaje es valido:

Mensaje 1

<ns0:Root xmlns:ns0="https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema">   <ns0:Record>      <ns0:Field>Field_0</ns0:Field>    </ns0:Record></ns0:Root>

Pero este otro no es valido:

Mensaje 2

<ns0:Root xmlns:ns0="https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema">   <Record>      <Field>Field_0</ Field>    </Record></ns0:Root>

De esta forma, las expresiones xpath son diferentes para ambos como se muestra a continuación respectivamente suponiéndose que se selecciona el campo "Field":

XPath 1

/*[local-name()='Root' and namespace-uri()='https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema']/*[local-name()='Record' and namespace-uri()='https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema']/*[local-name()='Field' and namespace-uri()='https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema']

XPath 2

/*[local-name()='Root' and namespace-uri()='https://Scorpio.BTS2006.Maps.Schemas.QualifiedShema']/*[local-name()='Record' and namespace-uri()='']/*[local-name()='Field' and namespace-uri()='']

En caso contrario, cuando la definición es elementFormDefault="unqualified" el mensaje Xml que encaja en forma perfecta es el Mensaje 2 y no el Mensaje 1, igualmente que la expresión XPath 2 seria la correcta en ves de la expresión XPath 1.

Cuando creamos un mapa de transformación, en el momento de compilarlo BTS automáticamente genera todo un documento XSLT para toda la asignación, en este caso se utilizan las expresiones xpath y BTS se basa para construirlas en la definición de los esquemas, por lo tanto si el esquema esta definido como qualified todas las expresiones xpath soportaran este modelo y no el unqualified y al ingresar el mensaje aparentemente bien construido no podrá llevarse acabo en forma correcta la orquestación.

Como se puede definir, es necesario tener cuidado en la forma como se definen los esquemas y la forma en la cual se construyen los mensajes Xml que se pretenden ingresar a BTS, aunque éste ejercicio es sencillo en muchas oportunidades nos pone muchos problema y no sabemos como arreglarlos si no tenemos el concepto de "qualified" y "unqualified" claros por lo que no va de mas hacer estos chequeos.

Autor: Carlos Medina

Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho