Transformación XSL (lectura)


Transformación XSL para lectura.


Ejemplo básico sobre creación de una trasformación XSL para transformar un documento XML a SAP. Este ejemplo podría haber complicado mucho más (validaciones, estilos, etc.), pero para su mejor entendimiento se ha simplificado todo lo posible.


Contenido.

Documento XML.

Transformación.
   1. Datos de cabecera.
   2. Templates.
   3. Bucles.


Call transformation.
   1. Llamada a la transformación.
   2. Errores comunes.
Enlaces de interés.





Documento XML.

Para este ejemplo se ha creado un documento el cual representará un almacén con datos sobre vehículos (coches y motos).

<vehiculos id_lote="1234567">
<coches id_lote="lotecoche">
<coche marca="ford" modelo="mustang">
<comentarios>
<comentario>
<![CDATA[Este coche está roto]]>
</comentario>
<comentario>
<![CDATA[Hay que repararlo]]>
</comentario>
</comentarios>
</coche>
    <coche marca="ferrari" modelo="enzo">
<comentarios>
<comentario>
<![CDATA[Este coche es muy caro]]>
</comentario>
</comentarios>
</coche>
</coches>
<motos>
<moto marca="honda" modelo="cbr600">
<comentarios/>
</moto>
<moto marca="yamaha" modelo="R6">
<comentario/>
</moto>
</motos>
</vehiculos>


Transformación.

1.      Datos de cabecera.

En SAP una trasformación siempre empieza con los datos de cabecera donde se definen los namespaces, versión del lenguaje, codificación, etc.

Imagen 1. Cabecera.

2.      Templates.

Luego tenemos que indicar el template o templates a aplicar a cada elemento.


Imagen 2. Templates.

Más información acerca del elemento template:
https://www.w3schools.com/xml/xsl_apply_templates.asp
Con <xsl:template match=”/”>, le estamos indicando a la transformación que comience la lectura del documento xml por el nodo raíz. Las etiquetas <asx:abap …> y <asx:values> son propias del lenguaje ABAP y son obligatorias. <IMESSAGE> es en nuestro ejemplo el nodo principal ya que se lo estaremos indicando en la llamada desde el programa de pruebas que se verá más tarde, por último con la etiqueta <xsl:apply-template select=”vehículos”> indicamos que empiece la lectura por el template cuyo nombre sea vehículos el cual corresponde también al nodo vehículos en el documento xml.







a)    Template vehículos.

Aunque puede existir más de un template, una transformación xsl con un formato de salida básico no necesitará más de uno.
Para comenzar a leer tanto nodos así como atributos de nodos se usa la etiqueta <xsl:value-of select=”string”> (XPATH), donde entre comillas pondremos el nombre del nodo que vallamos a extraer de nuestro xml o @ seguido del nombre para recuperar el valor de un atributo. Para guardar estos datos en SAP, Esta etiqueta tiene que estar entre las etiquetas de apertura y cierre, las cuales tienen que coincidir en su nombre con un campo de la estructura que habremos creado para ir almacenando los datos extraídos.



Imagen 3. Template vehículos.




3.      Bucles.

Para extraer el contenido de todos los nodos <coche> del documento xml, al ser este un nodo que se repite podemos verlo como líneas de una tabla y a su nodo padre <coches> que lo contiene podemos verlo como una tabla. Así pues, realizamos un bucle donde iteramos sobre todos los nodos xml <coche> que estén dentro de su etiqueta padre <coches>.




Imagen 4. Bucles.

a)    BUCLES ANIDADOS.

Si nos fijamos en la transformación, (ver imagen 4) el nodo comentarios también es una tabla con líneas comentario, y esta a su vez dentro del nodo coches que también es una tabla. Para anidar los bucles de manera que por cada coche extraiga su tabla de comentarios, basta con repetir la lógica anterior dentro del primer for-each cambiando los nombres de los nodos para que apunten hacia los nodos comentarios y comentario.

Call transformation.

Para la llamada a la transformación tenemos que crear una estructura SAP que encaje con la estructura del xml al que llamamos y del cual queremos leer su contenido (ver imagen 5). Para ello tenemos que tener claro que nodos van a poder repetirse y cuales no (campos y tablas).


Imagen 5. Estructura interna.




1.      Llamada a la transformación.

Con la estructura y la transformación creadas ya podemos proceder:


Imagen 6. Llamada a transformación.

Como muestra la imagen 6, se ha referenciado la tabla gt_message_xml la cual es del tipo estructura que hemos creado, con la estructura gs_result_xml (tipo: abap_trans_resbind_tab). Esto se hace para poder indicarle a la transformación que comenzará por el nodo principal IMESSAGE. Para ver el contenido extraído podemos poner un breakpoint justo después del endtry, para navegar por las tablas y campos de nuestra tabla gt_message_xml.

2.      Errores comunes.

Vamos a ver algunos errores típicos difíciles de detectar si no entendemos mucho de transformaciones ya que muchas veces SAP no nos muestra información del error, simplemente pueden no extraer los datos o duplicarlos en otros nodos.

·         No poner la etiqueta <asx:values> después de un bucle.
Si no ponemos esta etiqueta, el resultado será un error controlado por el try catch si intentamos extraer el contenido de un nodo o líneas vacías si solamente intentamos leer atributos.
·         Confundir los namespaces.
Si ponemos por ejemplo, <xsl:values> en vez de <asx:values> en un bucle, no extraerá ningún dato y tampoco mostrará un error.


  •  Usar una variable para hacer un bucle.

Obtendremos datos duplicados en todas las líneas en los que metamos datos de un bucle usando una variable xslt. Esto ocurre porque al crear por primera vez la variable esta guarda lo que tenía la ruta en el momento en el que se creó dicha variable.


  •  Usar una variable para acceder a un valor dentro de un blucle.

Como ocurre con el punto anterior, si creamos un bucle y dentro cogemos un valor de nodo o atributo que se tiene que repetir solo extraerá el primer valor que se guardó en la variable.


  • Falta de tabla o campo en estructura.

Cuando procedemos a extraer un dato, siempre hay que indicar mediante nodos de apertura y cierre a qué campo de nuestra estructura será enviado. Si en la estructura que le pasamos a la transformación no existe con nombre y posición exactos no se extrae ningún dato para ese campo.

  •  Sensibilidad a mayúsculas y minúsculas.

Los nodos que representan campos de SAP siempre van en mayúsculas, y las rutas hacia el elemento XML tiene que escribirse de manera idéntica a como esté escrito en el documento. De otra forma el valor no será grabado en SAP.

Enlaces de interés.




Comentarios