HTML en email con Pentaho Data Integration

Creo que todos en alguna ocasión hemos pensado si era posible enviar esos reportes en excel que extraemos con PDI, pero en lugar de como adjuntos en un correo, incrustados en forma de HTML en un email. Como una imagen vale mas que mil palabras, os dejo con un vídeo que muestra exactamente lo que vamos a conseguir hoy.

¿Queréis saber como hacerlo? vamos a ello…

Para que os hagáis una idea rápida, el aspecto general de nuestra (mini)ETL será este

El pase de diapositivas requiere JavaScript.

Es muy sencillo: el primer módulo genera un fichero XML que será parseado a HTML en el segundo paso. Este HTML se pasa a una variable de texto en el tercer paso y, finalmente, en el último paso se incrusta dicha variable con todo el contenido HTML en el cuerpo del email que será enviado.

En nuestro ejemplo, como habéis visto en el video, vamos a extraer los jugadores de los Chicago Bulls de nuestra base de datos baloncesto y, lo que sería una tabla exportada a excel, vamos a incrustarla en un email.

1. XML_GENERATOR

Aquí tendremos dos pasos, el input de la base de datos y el output a XML. En las imágenes os dejo la configuración exacta de ambos

El pase de diapositivas requiere JavaScript.

Importante a destacar es la pestaña Content, dentro del paso XML Output. En ella debemos configurar correctamente los parámetros Parent XML element y Row XML element que serán los que definan el elemento raíz y los elementos de cada fila del XML. En nuestro caso, Players y Player que generarán un fichero XML similar a este

output.xml

2. XML_TO_HTML

En este paso el objetivo es convertir el fichero XML en un fichero HTML, para ello vamos a usar el objeto XSL Transformation, configurado como en la siguiente imagen

xls_transformation

 Voy a explicar este paso en detalle ya que creo que es muy interesante e importante para el proceso. Configuramos estos tres pasos

  • XML File name: sencillo, es la ruta del fichero XML creado en el paso anterior.
  • XSL File name: lo principal sería comenzar por definir que es un fichero XSL o XSLT. Extraído de la Wikipedia, XSLT

XSLT o Transformaciones XSL es un estándar de la organización W3C que presenta una forma de transformar documentos XML en otros e incluso a formatos que no son XML. Las hojas de estilo XSLT – aunque el término de hojas de estilo no se aplica sobre la función directa del XSLT – realizan la transformación del documento utilizando una o varias reglas de plantilla. Estas reglas de plantilla unidas al documento fuente a transformar alimentan un procesador de XSLT, el que realiza las transformaciones deseadas poniendo el resultado en un archivo de salida, o, como en el caso de una página web, las hace directamente en un dispositivo de presentación tal como el monitor del usuario.

Actualmente, XSLT es muy usado en la edición web, generando páginas HTML o XHTML. La unión de XML y XSLT permite separar contenido y presentación, aumentando así la productividad.

En definitiva, es una plantilla que permite convertir documentos XML de una sintaxis a otra, en nuestro caso, a HTML que debe ser hecha a medida para cada uno de los envíos que queramos hacer con PDI. Es muy sencilla de configurar, aunque os dejamos más abajo, el ejemplo que hemos usado nosotros.

  • Output Filename: es el fichero, con extensión html, que generaremos en este paso.

3. HTML_TO_FIELD

Una vez tenemos el fichero HTML, el objetivo es pasar todo su contenido a una única variable que usaremos más adelante en el envío del email. Como hemos visto arriba, esta transformation tiene tres pasos

  • HTML input: este paso es en realidad un Text file input que tiene como fichero de origen el fichero .html creado en el paso anterior. Lo configuramos como vemos en las imágenes

El pase de diapositivas requiere JavaScript.

  • Group by: paso muy importante. Si os fijáis, en el paso anterior, hemos generado una única variable llamada html. Esta variable, si hacéis un preview, veis que va a devolver todo el contenido del html pero por filas, así que con el paso de Group By lo que vamos a conseguir es agrupar todo esto en un único campo. Para ello seleccionamos el tipo de agrupación Concatenate strings separated by y el campo Value, lo dejamos vació.
  • Set variables: Finalmente, con el campo html agrupado que hemos generado con el Group By, vamos a almacenarlo en una variable

El pase de diapositivas requiere JavaScript.

4. MAIL

 Y finalmente, llegamos al envío del email. La variable generada en el paso anterior será la que incrustemos en el cuerpo del email. Lo vemos en imágenes

El pase de diapositivas requiere JavaScript.

Como veis la variable html_body generada en el paso anterior se incrusta en la parte de Message / Comment como insertamos variables normalmente en PDI

${html_body}

Si ejecutamos el proceso completo deberíamos obtener un resultado similar al del vídeo de la portada.

Os dejo aquí un recorrido en vídeo por el proceso de ETL

Y os dejo todos los ficheros para descargar.

html_to_email

Espero que os sirva de ayuda 😉

Sergio Martín
Más de seis años de experiencia gestionando equipos y proyectos de Business Intelligence para diferentes sectores, apasionado de todos los procesos técnicos relacionados con la gestión de la información, el tratamiento de datos y la automatización de procesos

** Microstrategy 9.4 | Pentaho 5 (ETL) | Oracle 11g **

8 comments

  1. Hi Sergio,

    I tried this and get a error

    “Error : Failed to compile style sheet. 1 error detected”

    Is there any rules to be followed while creating the XSL style sheet? please let me know

    Thanks in advance

  2. This was helpful.
    I found that you can simplify this and avoid using the xsl transformation file by doing the following.
    1. in the add xml step, set root node to “tr” and the element name for each field “td”
    2. collapse everything to one row using group by (you can add a constant to your stream and group by that)
    3. add 2 constants containing html header and footer (using these terms loosely) and use concat to surround your table rows field.
    That’s it.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *