viernes, 13 de abril de 2007

Dilbert dentro de GeneXus Rocha

Imagen de "Dilbert dentro de GeneXus Rocha"Estamos a punto de liberar la CTP4 de GeneXus Rocha, y también su correspondiente GXextensions SDK.

Una de las novedades en este SDK es un nuevo proyecto ejemplo, llamado Daily Dilbert, que muestra cómo incorporar una ventana en el IDE de GeneXus que muestra diariamente una tira de Dilbert.

Más allá de Dilbert, creo que es un buen ejemplo de cómo utilizar XSL y RSS para mostrar contenido dinámico dentro de una ventana de GeneXus. Aquí lo que se muestra es una historieta, pero perfectamente podría ser cualquier otro tipo de información. Podrían ser cotizaciones, resultados deportivos, noticias, información interna de la empresa, o lo que se les ocurra.

El proyecto es muy parecido al ejemplo ToolWindow que ya existía. La única diferencia es el contenido del form, y la forma de cargarlo.

En el form, se colocó un control System.Windows.Forms.WebBrowser, indicando Fill para la propiedad Dock, de manera que ocupe todo el form.

Para cargar el contenido, se utiliza una transformación XSL precompilada, que es la encargada de construir el contenido HTML que cargaremos en el control, a partir del XML que obtenemos de un RSS. Pero vayamos por partes, para que no parezca complicado algo que en realidad es bastante sencillo.

En primer lugar tenemos un archivo XSLT que contiene las instrucciones acerca de cómo crear HTML a partir de un XML dado. Estas instrucciones las analizaremos luego, pero por el momento lo importante es que el contenido de ese archivo está disponible en la propiedad Transform de la clase Resources.

Dentro de la clase DilbertWindow, que es nuestra derivada de AbstractToolWindow, agregamos una propiedad para construir y almacenar nuestra transformación, de la siguiente manera:


private XslCompiledTransform transform;

public XslCompiledTransform Transform
{
get
{
if (transform == null)
{
XmlDocument xmlTransform = new XmlDocument();
xmlTransform.LoadXml(Resources.Transform);
transform = new XslCompiledTransform();
transform.Load(xmlTransform);
}

return transform;
}
}

Luego, hacemos override del método OnLoad(), para cargar el RSS, aplicarle la transformación y cargar el resultado en el control, utilizando el siguiente código:


protected override void OnLoad(EventArgs e)
{
StringWriter textWriter = new StringWriter(CultureInfo.InvariantCulture);
Transform.Transform("http://feeds.feedburner.com/tapestrydilbert",
new XsltArgumentList(),
textWriter);
webBrowser.DocumentText = textWriter.ToString();
}


El archivo XSLT que mencionábamos arriba es bastante sencillo. En forma resumida, escribe un documento HTML conteniendo únicamente una imagen con un link. Los datos para la imagen y para el link los toma del nodo del XML cuya ruta es /rss/channel/item/. Normalmente en el XML habrá más de un nodo item, por lo que se tomará el primero, que corresponde al último publicado. El contenido completo del archivo XSLT es el siguiente:


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>
<body>
<a target="_blank">
<xsl:attribute name="href">
<xsl:value-of
select="/rss/channel/item/link"/>
</xsl:attribute>
<img border="0">
<xsl:attribute name="src">
<xsl:value-of
select="/rss/channel/item/enclosure/@url" />
</xsl:attribute>
</img>
</a>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

No hay comentarios.: