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.
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.
Comentarios
Publicar un comentario