XSLT en AiR

Aunque no salga en la lista de prestaciones, AIR soporta de forma indirecta la transformación de XML’s a través de XSLT’s. El kit de la cuestión recae en el uso del componente HTML o mejor aún de HTMLLoader, teniendo en cuenta que el componente HTML es un wrapper de HTMLLoader en Flex.

El componente HTMLLoader lo que hace es delegar la interpretación y renderizado de código html en WebKit (el core de Safari). Y es este, WebKit, el que por sí mismo soporta XSLT de una forma muy sencilla.

A continuación muestro una pequeña prueba de concepto de cómo poder invocar xslt’s contra xml’s a través de una pequeña clase.


En el navegador, una forma de aplicar xslt a un xml directamente sería hacer lo siguiente:

  1. Creamos el xml que queremos transformar (model.xml)

    [ftf w=”550″ h=”200″]

    2
    11
    100
    -5
    [/ftf]

  2. Creamos la xlst que queremos (transformacion.xsl)

    [ftf w=”550″ h=”200″]



    Squares


    Squares





    The square of

    is
    .


    [/ftf]

  3. Aplicamos la xlst al xml mediante una processing instruction del estilo <?xml-stylesheet href=”transformacion.xsl” type=”text/xsl” ?>

Si cargamos modelo.xml en un navegador, éste parseará el xml y le aplicará la xslt indicada en la processing instruction dando como resultado un html (que es el que visualizaremos en el navegador).

Una de las funcionalidades que no podemos olvidar de HTMLControl es que es operativo aunque no esté incluido en la displayList. Podemos crear una clase que, usando un HTMLLoader pero sin representarlo visualmente, intercepte el XML, le añada la processing instruction y que capture el html resultante.

Este sería el circuito normal. Mediante HTMLLoader.loadString podemos cargar en el componente un xhtml generado al vuelo (el que queramos concatenado con la processing instruction). El problema de esto es que por algún extraño motivo, loadString no carga la xsl de transformación. Pero sí que funciona utilizando html.load (). Para paliar este comportamiento anómalo la siguiente clase lo que hace es crear un fichero temporal (que después se elimina) y que es el que el HTMLLoader cargará.

A continuación se muestra la clase XSLTProcessor.as
[ftf w=”550″ h=”400″]package com.mif.air.xsltProcessor
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.html.HTMLLoader;
import flash.net.URLRequest;

[Event (name=”complete”, type=”flash.events.Event”)]
public class XSLTProcessor extends EventDispatcher
{
private var html:HTMLLoader;
private var _output:String;

private var tmpXMLFile:File;
private var tmpXSLTfile:File;

public var xmlContent:XML;
public var xslt:File;

public function XSLTProcessor()
{
html = new HTMLLoader ();
html.addEventListener (Event.COMPLETE, htmlCompleteHandler);
}

public function parse ():void
{
if (this.xmlContent && this.xslt)
{
tmpXMLFile = File.applicationStorageDirectory.resolvePath (“tmpXML.xml”);
tmpXSLTfile = File.applicationStorageDirectory.resolvePath (xslt.name)
xslt.copyTo (tmpXSLTfile, true);

var alteredXML:String = “” + this.xmlContent.toString();

var fs:FileStream = new FileStream ();
fs.open(tmpXMLFile,FileMode.WRITE);
fs.writeUTFBytes (alteredXML);
fs.close();

html.load ( new URLRequest (tmpXMLFile.url));
}
}

private function htmlCompleteHandler (event:Event):void
{
this._output = html.window.document.documentElement.outerHTML;

this.dispatchEvent (new Event (Event.COMPLETE));
tmpXMLFile.deleteFile();
tmpXMLFile = null;
}

[Bindable (“complete”)]
public function get output ():String
{
return this._output;
}
}
}
[/ftf]

Una forma de usarlo sería desde una aplicación AIR basada en Flex:

[ftf w=”550″ h=”400″]




[/ftf]

Aún y tratarse de una aplicación funcional la clase anterior es una prueba de concepto que casi no he probado. La xsl es un poco chorra, pero es la primera que he encontrado en google.

La verdad que se me ocurren bastantes circunstancias en las que una xsl puede simplificar mucho un desarrollo. No sólo tenemos que pensar en las xsls como una herramienta para la capa de presentación, también podemos usarlas para transformar, adaptar o preparar modelos de datos: por ejemplo ordenación de árboles xml, agrupación, etc.

Xavi es un Technical Arquitect de Aplicaciones RIA basadas en la Plataforma Flash trabajando para Adobe en Londres. Especializado en aplicaciones colaborativas en tiempo real, e-learning y CMS (Content Management Systems) utiliza Flex, LCDS, BlazeDS, FMS y Java principalmente.

Sitio Web:http://www.code4net.com

2 Comentarios

  1. Pingback: MadeInFlex » Blog Archive » AIR: Domifying Flex

  2. Pingback: XSLT en Air | xperiments.es

Deja un comentario

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

Acerca de Made In Flex

Made In Flex es una comunidad de desarrolladores de Apache Flex creada en 2006.

Apache Flex, anteriormente conocido como Adobe Flex, es un SDK (kit de desarrollo de software) para crear aplicaciones enriquecidas - multiplataforma basadas en Adobe Flash donado por Adobe a la fundación Apache in 2011 y promocionado a proyecto de primer nivel en Diciembre de 2012.

Actualmente estamos cambiando muchos aspectos del sitio web para ofrecer un sitio útil para toda la comunidad que tenga en cuenta las necesidades actuales.

Últimas Fotos

Instalador de Apache Flex

Entrar o Registrase