Encadenar las transformaciones XSLT

2188 vistas

Si queremos encadenar las transformaciones XSLT tendremos que realizar varias transformaciones succesivas a un documento XML. Cada resultado de transformación será la source de la próxima. Para ayudarnos a realizar esto, el paquete org.xml.sax contiene la clase XMLFilter. Veamos el principio:

Imagen Enviada


Veamos un método que toma por parámetro un fichero XML, dos hojas de estilo xsl (las transformaciones a encadenar) y un fichero html de sallida.



java
  1. public static void transformer(File xml,
  2.             File xsl1,
  3.             File xsl2,
  4.             File html) throws Exception{
  5.   // creación del reader inicial
  6.   SAXParserFactory spf = SAXParserFactory.newInstance();
  7.   spf.setNamespaceAware(true);
  8.   XMLReader reader = spf.newSAXParser().getXMLReader();
  9.  
  10.   // Creación de los filtros a aplicar al reader
  11.   SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();
  12.   XMLFilter filtro1 = stf.newXMLFilter(new StreamSource(xsl1));
  13.   XMLFilter filtro2 = stf.newXMLFilter(new StreamSource(xsl2));
  14.  
  15.   // "ligamos" el reader a los filtros
  16.   filtro1.setParent(reader);
  17.   filtro2.setParent(filtro1);
  18.  
  19.   // Creación del source: es el último filtro de la cadena
  20.   // El resultado es el fichero HTML
  21.   SAXSource source = new SAXSource(filtro2, new InputSource(new FileInputStream(xml)));
  22.   StreamResult resultado = new StreamResult(new FileOutputStream(html));
  23.  
  24.   // Transformación en cadena
  25.   Transformer transformer = stf.newTransformer();
  26.   transformer.transform(source, resultado);
  27. }