XML (eXtensible Markup Language) representa para la programación Web lo que fue TCP/IP en su momento para la conexión de la Web, o el lenguaje HTML para la navegación. Las primeras especificaciones de XML aparecieron a mediados de la década pasada (1995) y, en la actualidad, ya es un formato estándar de intercambio de información en el Web. Está presente en la mayoría de los actuales emprendimientos de desarrollo y también se usa como lenguaje para lectura de configuraciones o para crear interfaces XML que interactúen con sistemas viejos.
La aparición de XML trajo consigo el nacimiento de una gran cantidad de lenguajes que lo complementan. Entre ellos se encuentra el XSL (eXtensible Stylesheet Language) cuyo principal uso es "mostrar" los datos de archivos XML y que fue creado con dos objetivos primordiales:
1-Transformar archivos XML a otros tipos de archivos -> XSLT (eXtensible Markup Language Transformation)
Originalmente fue pensado para realizar complejas operaciones de style como ser generar una tabla de contenido, índices, etc. cosas que el CSS (Cascade Style Sheet) no podía realizar. Sin embargo, XSLT hoy por hoy es utilizado como herramienta de propósito general para el procesamiento de archivos XML.
2-Obtener una versión "imprimible" de un archivo XML -> XSL-FO (eXtensible Markup Language Formatting Objects)
Transformaciones XSL utilizadas en GeneXus
Hoy por hoy en GeneXus las transformaciones con XSL son utilizadas en varios componentes:
1- El caso más conocido son todos los listados GeneXus, ya que nuestros listados requerían cada vez más datos y requerían continuos cambios de UI (User Interface), se decidió ir hacia un esquema más flexible. En este nuevo esquema, GeneXus es el encargado de generar XML para la información en la Base de Conocimiento y luego se le presenta al usuario mediante archivos XSLT.
En este caso la entrada es un XML y la salida un HTML
2- En el editor de temas de la versión Olimar se utiliza para a partir de un XML que especifica el tema, se genera el Cascade Style Sheet correspondiente al tema.
En este caso la entrada es un XML y la salida un CSS
3- WSDL Inspector: Se utiliza para convertir de un XML externo a un formato conocido por GeneXus también en XML. En este caso la entrada es un XML y la salida un XML.
Además, XSLT es utilizado en general para realizar cualquier tipo de procesamiento de un archivo XML.
Si bien XSLT y XSL-FO empezaron como dos especificaciones conjuntas luego se separaron, y en este artículo se dará una breve introducción a XSLT y sus aplicaciones.
Como ya se dijo XSLT permite transformar archivos XML: con un archivo XSLT se especifica la transformación a realizarse sobre un archivo XML, para obtener un archivo HTML, XML, VML, txt, ini, etc. Y luego, un procesador de XSTL se encarga de realizar dicha transformación.
Un archivo XSL es un archivo XML que está integrado por un conjunto de templates que indican qué cambios se deben hacer en determinado conjunto de nodos.
Los procesadores XSL se incluyen en la mayoría de los navegadores existentes, y varian la forma de aplicación del XSLT al archivo XML.
Por ej. en Internet Explorer se puede especificar mediante una instrucción XML en el xml de entrada cuál es el xsl que se aplicará.
<?xml-stylesheet type="text/xsl" ref.="MyXSL.xsl" ?>
Esta instrucción hace que el browser antes de mandar el resultado aplique la transformación con "MyXSL.xsl" y luego el resultado lo mande al output del browser.
En este caso la transformación se realiza en el cliente aprovechando la capacidad del navegador. Otra alternativa es no confiar que el cliente tendrá el procesador XSL y realizar la transformación en el server y luego mandar el resultado al cliente.
Como introducción al lenguaje veamos un ejemplo sencillo:
Supongamos una empresa de software que tiene un conjunto de productos a la venta. Esta lista de productos debe ser accesible a los proveedores así como también debe ser publicada en el sitio de la empresa.
Los proveedores reciben los datos para ser procesados en formato XML y cada uno de ellos tiene un XSL para el realizar el procesamiento y transformación del XML. La empresa de software, por su parte, también cuenta con un XSL por defecto para aquellos proveedores que no quieren preocuparse por la presentación de los datos.
El XML utilizado para el intercambio es muy simple:
Uno de los proveedores quiere exponer simplemente
un HTML así:
Producto Versión
GeneXus 7.5
GXQUERY 1.0
Antes de empezar a ver el XSLT debemos saber qué es lo que tenemos que generar en formato HTML. En este caso sería:
<TABLE>
<TR><TD> <B> Producto </B> </TD> <TD> Version </TD> </TR>
<TR><TD> GeneXus </TD> <TD>7.5</TD> </TR>
<TR><TD> GXQuery </TD> <TD>1.0</TD> </TR>
</TABLE>
Digamos que el stylesheet en este caso es bastante sencillo porque existen muy pocos datos a tomar del XML.
¿Cómo se aplica XSL para generar el resultado deseado?
Como en todo lenguaje hay varias formas de obtener el mismo resultado. en XSL hay dos estilos claramente diferentes:
- Procedural: como en el ej. se guía al procesador XSLT que templates debe ir aplicando en todo momento.
- Declarativo: en este esquema se deben declarar más templates, y se deja al procesador la tarea de la aplicación de los templates.
Claramente nunca se hace una programación totalmente en un esquema, pero en lo posible siempre es conveniente programar en el esquema declarativo y cuando no hay más remedio guiar al procesador, debido a las ventajas de la programación declarativa que permite mantener el código XSL y reutilizar templates.
Esquema procedural:
Este XSLT consta de un único template que aplica al nodo raíz, donde se le indica al procesador de XSL lo que tiene que imprimir en la salida de dicho nodo.
Por otro lado, aquellos nodos que tienen el prefijo "xsl" le señalan al procesador de XSL que debe realizar alguna operación sobre el XML de entrada. Por ej. el <xsl:for-each> indica que se deben recorrer todos los nodos señalados por el atributo "select". En el ejemplo se refiere a recorrer los productos, por tanto cuando se entra en el for-each siempre se tiene un nodo seleccionado de tipo Producto.
El <xsl:value-of> devuelve el valor de cierto nodo, si el nodo es terminal devuelve su valor sino devuelve la concatenación de todos los valores de sus nodos hojas.
|