i2factory usa internamente la tecnología de transformaciones XSLT, que nos permite componer nuevos mensajes XML en base a un mensaje de entrada y una plantilla de transformación, algo imprescindible cuando integramos distintas aplicaciones y sistemas

Este artículo pretende servir de punto de entrada del lenguaje de estilos de transformaciones XSLT para aquellos usuarios no avanzados o desconocedores de este estándar. Aunque no es estrictamente imprescindible, es muy recomendable que el usuario de i2factory tenga conocimientos de estos lenguajes, al menos a un nivel básico.


93Mhyp7iQlNST6Ghx8MMq5Yq3WHGIR5DiA.pngTutorial oficial de W3C y web para hacer tests
Este artículo está basado en la información online publicada por W3C sobre XSLT e incluye un resumen del tutorial oficial. Te recomendamos que visites los sitios webs de la W3C si la información contenida en este artículo te resulta insuficiente. Existen varias webs online en la que puedes probar tus transformaciones XSLT para comprobar que estén correctas.
Prueba por ejemplo: http://www.freeformatter.com/xsl-transformer.html
http://www.xsltcake.com


¿Qué es XSLT y cómo funciona?

XSLT es el acrónimo de eXtensible Stylesheet Language Transformations y pertenece al conjunto de lenguajes incluidos en XSL, el Lenguaje Extensible de Hojas de Estilo recomendado para XML, que surgió por la necesidad de dotar a XML de un lenguaje de estilos. 

XSL funciona como un lenguaje avanzado para crear hojas de estilos, pero XSL es mucho más que un lenguaje de estilos de XML. En su interior contiene los lenguajes de expresiones y de transformaciones que usamos en i2factory:

  • XSLT - lenguaje para la transformación de documentos XML
  • XPath - lenguaje para la navegación de documentos XML

XSLT es la parte más importante de XSL puesto que con XSLT puedes transformar cualquier documento XML en cualquier otro documento XML, como por ejemplo en una página HTML o XHTML.

Es capaz de transformar, ordenar y filtrar datos XML, y darles formato basado en sus valores de origen. Con XSLT también puedes añadir y eliminar elementos y atributos hacia o desde un archivo de salida. También puedes reordenar y clasificar elementos, ejecutar test y tomar de decisiones sobre qué elementos ocultar o mostrar, y muchas más cosas. 

XSLT usa XPath para definir partes del documento XML origen que deberían coincidir con uno o más templates predefindos (XSLT Stylesheet) generando un documento de salida. Cuando se encuentra una coincidencia, el procesador XSLT transformará la parte correspondiente del documento de origen en el documento de resultado. La clave de XSLT por tanto es definir la Hoja de Estilo XSL adecuada, ver ejemplo de transformación más abajo.

Esta rica funcionalidad es lo que hizo que i2factory se decantara por XSLT para implementar las transformaciones de los mensajes.


tNOM6I062rZRYIHy5wzv_aaPXWy-9EnR_Q.pngXSL vs CSS
CSS sirve para añadir estilos a los elementos HTML, que todos los navegadores y programas del mundo sabe mostrar correctamente, puesto que HTML usa etiquetas predefinidas bien conocidas.
Sin embargo, XML no usa etiquetas predefinidas y por tanto el significado de las mismas no se conoce a priori, por lo que XSL surgió para describir cómo deberían mostrarse en una web los elementos XML. XSL es más sofisticado que CSS.


Ejemplo de transformación

A continuación tienes un ejemplo de una transformación XSLT compuesta por:

  1. documento XML que almacena la información sobre un catálogo de CDs (izquierda)
  2. al que se le aplica una transformación XSLT que incluye expresiones XPATH (centro) 
  3. para obtener un nuevo XML que resulta ser una página web en formato HTML (derecha).


XPATH Versión 2.0

i2factory soporta la versión 2.0 de XPATH y XSLT desde la versión 2.0.6 release de i2factory core.


XSLT y XPATH


 
XSLT hace uso del lenguaje XPATH para encontrar y localizar información en un documento XML.

Por ello, si no estás familiarizado con XPATH te aconsejamos eches un vistazo al artículo sobre XPATH y al artículo sobre XML.

Estructura de un sistema XSLT:

eu8oPOBpsZN1YTSdxyA4juBK3v3A8HkPEw.png

Una manera común de describir el proceso de transformación es decir que XSLT transforma un árbol-origen XML en un árbol-destino XML.


Fichero XML de clasificación de CDs
<?xml version="1.0" encoding="ISO-8859-1"?>

<catalog xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">

    <foo:cd>

        <title>Empire Burlesque</title>

        <artist>Bob Dylan</artist>

        <country>USA</country>

        <company>Columbia</company>

        <price>10.90</price>

        <bar:year>1985</bar:year>

    </foo:cd>

    <foo:cd>

        <title>Hide your heart</title>

        <artist>Bonnie Tyler</artist>

        <country>UK</country>

        <company>CBS Records</company>

        <price>9.90</price>

        <bar:year>1988</bar:year>

    </foo:cd>

    <foo:cd>

        <title>Greatest Hits</title>

        <artist>Dolly Parton</artist>

        <country>USA</country>

        <company>RCA</company>

        <price>9.90</price>

        <bar:year>1982</bar:year>

    </foo:cd>

</catalog>

Ejemplo de transformación XSLT (con expresiones XPATH)

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">

<xsl:template match="/">

  <html>

  <body>

  <h2>My CD Collection</h2>

    <table border="1">

      <tr bgcolor="#9acd32">

        <th>Title</th>

        <th>Artist</th>

        <th>Country</th>

        <th>Company</th>

        <th>Price</th>

        <th>Year</th>

      </tr>

      <xsl:for-each select="catalog/foo:cd">

      <tr>

        <td><xsl:value-of select="title"/></td>

        <td><xsl:value-of select="artist"/></td>

        <td><xsl:value-of select="country"/></td>

        <td><xsl:value-of select="company"/></td>

        <td><xsl:value-of select="price"/></td>

        <td><xsl:value-of select="bar:year"/></td>

      </tr>

      </xsl:for-each>

    </table>

  </body>

  </html>

</xsl:template>

</xsl:stylesheet>


Ejemplo de XML transformado (página web)

<?xml version="1.0" encoding="UTF-8"?>

<html xmlns:bar="http://www.bar.org" xmlns:foo="http://www.foo.org/">

   <body>

      <h2>My CD Collection</h2>

      <table border="1">

         <tr bgcolor="#9acd32">

            <th>Title</th>

            <th>Artist</th>

            <th>Country</th>

            <th>Company</th>

            <th>Price</th>

            <th>Year</th>

         </tr>

         <tr>

            <td>Empire Burlesque</td>

            <td>Bob Dylan</td>

            <td>USA</td>

            <td>Columbia</td>

            <td>10.90</td>

            <td>1985</td>

         </tr>

         <tr>

            <td>Hide your heart</td>

            <td>Bonnie Tyler</td>

            <td>UK</td>

            <td>CBS Records</td>

            <td>9.90</td>

            <td>1988</td>

         </tr>

         <tr>

            <td>Greatest Hits</td>

            <td>Dolly Parton</td>

            <td>USA</td>

            <td>RCA</td>

            <td>9.90</td>

            <td>1982</td>

         </tr>

      </table>

   </body>

</html>



El resultado de aplicar la transformación XSLT al fichero XML da como resultado el documento HTML de la derecha (que es un caso concreto de documento XML) que se 
muestra de esta manera cuando se abre con un navegador:

Hl47PsAOG9nxIq-TUBTVR0BzlAnHOMtbrw.png


XSLT en i2factory

i2factory usa XSLT para realizar las transformaciones de los mensajes que llegan a una tarea Translator siendo el estándar marcado por XSL, una tecnología derivada de XML. 

La tarea de integración Translator hace uso de las plantillas XSL para componer nuevos mensajes, transformando el mensaje que le llega por el slot de entrada a un nuevo mensaje, tomando como plantilla la transformación expresada en formato de estilos XSLT. El procesador de XSL aplica la plantilla XSLT al mensaje XML entrante, resultando un nuevo XML en el slot de salida con la transformación aplicada.

En la siguiente imagen se muestra un ejemplo de plantilla de transformación que compone un nuevo mensaje con el nodo raíz MailSmtpBean que es apto para el puerto de salida del conector SMTP



CCaskYBw3qfz9wT7xcBXbJpRfcaoAOVgEA.png

En dicha plantilla de transformación se indican varios valores de nodos de manera "estática" como el remitente del email (support@guaranadev.i2factory.com) o el asunto del correo (TEST XML Request) mientras que otros valores los coge de manera "dinámica" provenientes del mensaje de entrada como el destinatario del email (//root/extra/mailFrom) o el cuerpo del email (//root/document/bookstore/book/title)

Prácticamente todos puertos de salida requieren de una tarea Translator para poder traducir el esquema interno del mensaje XML a un esquema apropiado para el comando seleccionado en el conector de salida, de manera que este pueda realizar la traducción adecuada a la aplicación o servicio externo.

No es necesario conocer XSL en profundidad ni escribir los XSLT a mano para usar i2factory. Puedes usar el mapeador de datos para realizar las transformaciones más simples:

J-uyU6CrRvroM7IfX8NeX6upW5z5KBZGqg.png



Elementos XSLT

En este apartado incluiremos un resumen de los elementos más importantes que componen el lenguaje XSLT para que puedas definir tus propias transformaciones XSLT

Declaración de la hoja de estilo

Hay dos formas equivalentes de indicar que un documento es una hoja de estilos XSL:

<xsl:stylesheet version="1.0"xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">

...

o bien, 

<xsl:transform version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">

...

El documento XSLT siempre tendrá como nodo raíz que engloba a todos los demás una de esas dos declaraciones.


Para acceder a los elementos XSLT, atributos y características debemos declarar el espacio de nombres XSLT arriba del documento. Se utilizará el espacio de nombres proporcionado por la W3C para usar los elementos XSLT: xmlns:xsl="http://www.w3.org/1999/XSL/Transform".


tNOM6I062rZRYIHy5wzv_aaPXWy-9EnR_Q.pngReferencias: Existen más elementos definidos para XSLT así como también muchas funciones que se pueden utilizar para dotar de más potencia nuestra hojas de estilo XSL. La W3School ofrece una recopilación de referencia en: http://www.w3schools.com/xsl/xsl_w3celementref.asp http://www.w3schools.com/xsl/xsl_functions.asp
tNOM6I062rZRYIHy5wzv_aaPXWy-9EnR_Q.pngTag <?xml> Since an XSL stylesheet is an XML document, you should always start with the XML declaration: <? Xml version = "1.0" encoding = "UTF-8"?>



<xsl:template>

Una hoja de estilos XSL está compuesta de un conjunto de reglas que se denominan templates. Cada template contiene el conjunto de reglas a aplicar cuando un nodo especificado es encontrado en el documento XML. 

El atributo match nos permite asociar un elemento XML con el template. Su valor es una expresión XPath .Por ejemplo, si se especifica el nodo raíz "/", el conjunto de reglas será aplicado a todo el documento XML.



<?xml version="1.0"?><xsl:stylesheet version="1.0"xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <tr>
      <td>.</td>
      <td>.</td>
    </tr>
  </table>
  </body>
  </html>

</xsl:template>

</xsl:stylesheet>


<xsl:value-of>

Extrae el valor de un elemento XML y lo añade al stream de salida. El atributo select contiene la expresión XPath que identifica el elemento.


<?xml version="1.0"?><xsl:stylesheet version="1.0"xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
    <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
         <th>Title</th>
         <th>Artist</th>
        </tr>
      <tr>
        <td><xsl:value-of select="catalog/cd/title"/></td>
        <td><xsl:value-of select="catalog/cd/artist"/></td>
    </tr>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>


<xsl:for-each>

Nos permite iterar sobre un conjunto de elementos especificado por una ruta XPath (atributo select). Esto nos permite seleccionar todos los elementos de un conjunto de nodos especificado.


<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
        <tr>
          <td><xsl:value-of select="title"/></td>  
          <td><xsl:value-of select="artist"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

Es posible filtrar utilizando los siguientes operadores

  • = (igual)
  • != (distinto)
  • &lt; (menor que)
  • &gt; (mayor que)


...<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
    <tr>
        <td><xsl:value-of select="title"/></td>  
        <td><xsl:value-of select="artist"/></td>
    </tr>
</xsl:for-each>
...


<xsl:sort>

Nos permite ordenar el flujo de salida. Simplemente hay que añadir el elemento <xsl:sort> dentro del <xsl:for-each>El atributo select nos especifica el elementos sobre el que ordenamos.


<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
        <xsl:sort select="artist"/>
        <tr>
          <td><xsl:value-of select="title"/></td>  
          <td><xsl:value-of select="artist"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>


<xsl:if>

Incluye una prueba condicional. El test se realiza sobre un elemento concreto del fichero XML. El atributo test contiene la expresión que será evaluada, de manera que sólo se procesará el bloque interior del if si se cumple la condición.

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<html>

  <body>

    <h2>My CD Collection</h2>

    <table border="1">

      <tr bgcolor="#9acd32">

        <th>Title</th>

        <th>Artist</th>

      </tr>

      <xsl:for-each select="catalog/cd">

        <xsl:if test="price &gt; 10">

        <tr>

          <td><xsl:value-of select="title"/></td>  

          <td><xsl:value-of select="artist"/></td>

        </tr>

        </xsl:if>

      </xsl:for-each>

    </table>

  </body>

</html>

</xsl:template>

</xsl:stylesheet>


<xsl:choose>

Incluye un condicional múltiple. Las condiciones se introducen con <xsl:when> y <xsl:otherwise> si no se cumple ninguna condición.


<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
        <tr>
          <td><xsl:value-of select="title"/></td>
            <xsl:choose>
             <xsl:when test="price &gt; 10">
                <td bgcolor="#ff00ff">
                <xsl:value-of select="artist"/></td>
             </xsl:when>
             <xsl:otherwise>
                <td><xsl:value-of select="artist"/></td>
             </xsl:otherwise>
         </xsl:choose
        </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>




Resultado de aplicar la transformación XSL al documento XML original Fichero XML de clasificación de CDs y visualizarlo en un navegador:


 

kFavwlVLl7DHTOsKiCMZ4QHTm3Rd5-RXaA.png

En el ejemplo anterior se define una única template con el atributo match="/", que asociará el template con el nodo raíz del documento XML de origen.

Luego, el contenido dentro de la marca <xsl:template> define código HTML que se escribirá en el documento de salida.

En este ejemplo, no se toma ningún valor del XML de origen. Para tal caso ver el siguiente apartado sobre el elemento <xsl:value-of>.


Resultado de aplicar la transformación XSL al documento XML original Fichero XML de clasificación de CDs y visualizarlo en un navegador:


qsH1TZUo-Y-W1iR4x-9c0JdzuqJXhwY9GA.png

 

Observa que al usar el valor de select ="catalog/cd/title" tan sólo se procesa el primer cd del catálogo.

Para procesar más items, ver el siguiente apartado sobre el elemento <xsl:for-each>.




Resultado de aplicar la transformación XSL al documento XML original Fichero XML de clasificación de CDs y visualizarlo en un navegador:

swdL8XJQqB7OsuP2C8UV-YldOgjvsZmKpw.png

El resultado aplicando el filtro sería:


IZDsjmAGquwi9j2TLvi2LXQOjz5NS7M-nQ.png