Inicio /
Elemento Template (Plantilla) – Etiqueta <xsl:template>

Elemento <xsl:template>

El elemento <xsl:template> es usado para crear plantillas.

El atributo match es usado para asociar la plantilla con un elemento XML. El atributo match puede ser usado también para definir una plantilla para un archivo xml entero. El valor de la atributo match es una expresión XPath (p.e. match =”/” define el documento completo).

Veamos un ejemplo simple de un archivo xsl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>Mi colección de CDs</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Titulo</th>
<th>Artista</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Ya que un documento XSL en si mismo es un documento XML, siempre comienzará con la declaración XML: <?xml version="1.0" encoding="ISO-8859-1"?>.

El siguiente elemento, <xsl:stylesheet>, define que este documento es un documento de hoja de estilo XSLT (con el número de versión y el atributo namespace de XSLT).

El elemento <xsl:template> define una plantilla. El atributo match="/" asocia a la plantilla con la raíz del documento XML.

El contenido incrustado dentro del elemento <xsl:template> define el código HTML que se escribirá en la salida.

Las dos últimas líneas definen el final de la plantilla y el final de la hoja de estilo.
El resultado de la transformación encima se parecerá a esto:

Si a la hoja de estilos la procesamos junto con el siguiente documento XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited with XML Spy v4.2 -->
<catalogo>
<cd>
<titulo>Empire Burlesque</titulo>
<artista>Bob Dylan</artista>
<pais>USA</pais>
<discografica>Columbia</discografica>
<precio>10.90</precio>
<anio>1985</anio>
</cd>

<cd>
<titulo>The dock of the bay</titulo>
<artista>Otis Redding</artista>
<pais>USA</pais>
<discografica>Atlantic</discografica>
<precio>7.90</precio>
<anio>1987</anio>
</cd>
<cd>
<titulo>Picture book</titulo>
<artista>Simply Red</artista>
<pais>EU</pais>
<discografica>Elektra</discografica>
<precio>7.20</precio>
<anio>1985</anio>
</cd>

<cd>
<titulo>Red</titulo>
<artista>The Communards</artista>
<pais>UK</pais>
<discografica>London</discografica>
<precio>7.80</precio>
<anio>1987</anio>
</cd>
<cd>
<titulo>Unchain my heart</titulo>
<artista>Joe Cocker</artista>
<pais>USA</pais>
<discografica>EMI</discografica>
<precio>8.20</precio>
<anio>1987</anio>
</cd>
</catalogo>

El resultado sería el siguiente documento HTML:

<html>
<body>
<h2>Mi coleccion de CDs</h2>
<table border="1">
<tr bgcolor="#9acd32"><th>Titulo</th><th>Artista</th></tr>
<tr><td>.</td><td>.</td>
</tr>
</table>
</body>
</html>

El siguiente paso mostraremos la manera de como se usa la etiqueta <xsl:value-of> para seleccionar ciertos elementos del documento XML.


Daniel P. @ 20:39 | comentarios (0) | Links Permanentes


Introducción a XSL - XSLT

XSLT Características:

  • XSL: eXtensible Style Language
  • XSL es la especificación que desarrolla el lenguaje de formateo.
  • XSL consiste en tres partes:
    • XSLT – lenguaje para la transformación de documentos XML.
    • XPath – lenguaje para la navegación en documentos XML.
    • XSL-FO – lenguaje para el formateo de documentos XML.
  • XSLT es la especificación que desarrolla el lenguaje de transformación. Hace uso de la especificación XPath. Ha sido diseñada para ser utilizada de forma independiente aunque es utilizada desde la especificación XSL.
  • XSLT es un lenguaje de programación de hoja de estilos para la transformación de documentos XML en otros documentos XML, HTML, XHTML, WML o incluso PDF.

  • XPath es la especificación que desarrolla el lenguaje para acceder a los elementos de un documento XML. Ha sido desarrollada para ser utilizada desde la especificación XSLT y XPointer.

  • XSLT, XSL, XSL-FO y XPath están definidos en XML
  • XSLT, XSL, XPath y XSL-FO son recomendaciones del W3C.

XSLT permite:

  • Formatear los elementos fuente basados en relaciones de ancestro/descendiente, posición y unicidad.
  • La creación de construcciones de formato sofisticadas incluyendo texto generado e imágenes
  • La definición de macros de formateo reutilizables
  • Estilos independices de la dirección en que se escriba el lenguaje
  • Conjunto de objetos de formato extensible
  • Una manera de describir el proceso de transformación es decir que las XSLT  transforma un árbol XML de entrada e otro árbol XML de salida.

Árboles

  • El documento original se traduce a un árbol que representa el documento original:
    • raíz del árbol -> elemento raíz
    • hijos de un nodo -> elementos contenidos en él
  • El estilo convierte este árbol en un árbol de objetos de flujo.
  • La conversión se hace a través de reglas de construcción
  • Una regla de construcción de se compone de:
    • patrón, que especifica a que elementos de árbol fuente se aplica
    • acción, que indica como se traduce un subárbol a otro
    • el estilo se procesa recursivamente

Ejemplo

Para empezar, vamos a tratar de presentar una hoja XML lo más simple posible (ejemplo0.xml):

 

<?xml version="1.0" encoding='ISO-8859-1'?>

<?xml-stylesheet href="pagina0.xsl" type="text/xsl"?>

<pagina_web>

   <nombre>CocinaTusRecetas</nombre>

   <url>http://www.cocinatusrecetas.com</url>

</pagina_web>

 

Para convertirlo en HTML, usaremos la siguiente hoja de estilo (pagina0.xsl):

1 <?xml version="1.0" encoding="UTF-8"?>

2 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

3 <xsl:template match='/'>

4 <html>

5 <head><title>Ejemplo</title></head>

6 <body>

7 <h1> <xsl:apply-templates /> </h1>

8 </body>

9 </html>

10 </xsl:template>

11 </xsl:stylesheet>

 

El resultado sería el siguiente documento HTML:

<html>

<head><title>Ejemplo</title></head>

<body>

<h1> CocinaTusRecetas http://www.cocinatusrecetas.com </h1>

</body>

</html>

 

Explicación del código

Para empezar, el código del documento XML contiene una etiqueta pagina_web, que incluye otras dos etiquetas nombre y url, que contienen el texto que queremos que aparezca en la página web. En el resto, la primera línea simplemente describe que el resto del documento es XML y asocia la hoja de estilo XSLT (pagina0.xsl) al documento.

Esta segunda línea se usa en entornos de publicación tales como el Cocoon; algunos procesadores de XSLT la usan para tomar el nombre de la hoja de estilo que se va a usar; también lo suelen usar navegadores como el Mozilla/Netscape/Firefox o el Internet Explorer. Cada una de estas etiquetas se denominan elementos; y en principio, un documento puede tener tantas etiquetas como queramos.

El XML original, como se ve, es simplemente XML bien formado no usa un DTD ni lo necesita. Basta con que haya una etiqueta raíz (pagina_web, en nuestro caso), las etiquetas estén emparejadas correctamente y los atributos entre comillas. Diferentes documentos XML podrían ser procesados con la misma hoja de estilo, y darían diferente resultado salvo por el hecho de que es una forma de mantener una apariencia común.

La primera hoja de estilo con la que nos enfrentamos es relativamente simple. El "esqueleto" es un documento HTML normal, al cual tenemos que añadir "contenido dinámico", es decir, contenido generado a partir del XML original.

Para empezar, se incluyen una serie de instrucciones, de la línea 1 a la 3: no son instrucciones en sí, sino que modifican el aspecto de la salida. La primera declara el documento XML y el tipo de codificación (que podría ser ISO-8859-1 en vez de UTF-8 si quisiéramos incluir acentos y demás caracteres idiosincrásicos) y la segunda es la etiqueta raíz de la hoja de estilo (cerrada en la última línea; recordemos que una hoja de estilo XSL es también un documento XML y por tanto tiene que seguir todas sus convenciones), que declara la versión de XSLT que se está usando y el espacio de nombres (namespace) que vamos a usar, es decir, el prefijo que usarán todas las instrucciones propias de XSLT; en este caso, usamos xsl, pero cambiando esta instrucción podríamos usar otro cualquiera.

Ese esqueleto está organizado en "templates", que son partes de la hoja que se "disparan" cuando encuentran una etiqueta que corresponda a lo que hay en su atributo match. El primer y único template comienza en la línea 3, y, en este caso, el template que corresponde a la etiqueta raíz genera un esqueleto de página HTML. La "orden" en la línea 7 cede el control a los otros templates, es decir, trata de aplicar todos los demás templates que haya en el documento, incluyendo el resultado de aplicarlos precisamente en ese punto (es decir, entre las etiquetas h1. En este caso no hay más templates, salvo los llamados los templates por defecto, que lo único que hacen es incluir el contenido de las etiquetas en el documento de salida. Es decir, en la práctica lo que hemos hecho es decirle dónde tiene que incluir en el esqueleto los valores del documento original, sin procesarlos más.

La orden <xsl:apply-templates /> podría haberse sustituido, en este caso, por <xsl:value-of select='pagina_web' /> y habría tenido exactamente el mismo efecto, es decir, incluir el contenido de la etiqueta pagina_web (y todas las que descienden de ella). 

 


Daniel P. @ 16:52 | comentarios (5) | Links Permanentes


Para servir desde un servlet una imagen de acceso restringido

Este código nos servirá como ejemplo para lanzar otros tipos de archivos que no sean imágenes que también tengan algún tipo de acceso restringido.

 

En primer lugar deberemos de sustituir la url de la imagen por la del servlet que nos la devuelve, es decir las etiquetas img quedarían de la siguiente manera:

<img src="direcciónServlet\nombreServlet"/>

Como vemos se sustituirá el recurso de la imagen por el servlet que nos lo devuelve.

 

El código es el siguiente:

package utils.imagenes;

 

import javax.servlet.http.HttpServlet;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

import java.io.*;

import javax.mail.*;

import javax.mail.internet.*;

import java.text.*;

import com.ti.comunes.*;

import utils.constantes.*;

 

public class Obtener_Imagen extends HttpServlet {

       public void init() throws ServletException {

}

 

public void doPost(

       javax.servlet.http.HttpServletRequest request,

       javax.servlet.http.HttpServletResponse response)

       throws javax.servlet.ServletException, java.io.IOException {

}

 

public void doGet(

       javax.servlet.http.HttpServletRequest request,

       javax.servlet.http.HttpServletResponse response)

       throws javax.servlet.ServletException, java.io.IOException {

                                       

       String myID = (String) request.getParameter("ID");

       try {

           //primeramente, comprobamos que se ha pasado el ID, si no existe no se devuelve foto                          

           if (myID == null)

               throw new Exception("[utils.imagenes.ObtenerImagen]Parametro tiene un valor desconocido");

           else

           {

               try{  

                   //leemos el fichero del ftp,usando el metodo que traduce el path

                   File f = new File(utils.constantes.ConstantesRID.FILE_PATH+myID+".jpg");

                   RandomAccessFile raf = new RandomAccessFile(utils.constantes.ConstantesRID.FILE_PATH+myID+".jpg", "r");

                   FileInputStream fis = new FileInputStream(f);

                   FileReader fr = new FileReader(f);

                   int i;

                   byte b[] = new byte[(int) f.length()];

                   raf.read(b);

                                       

                   //cabecera

                   response.setHeader("Content-Type","img/jpeg");

                   response.setIntHeader("Content-Length", (int) f.length());

                  //response.setHeader("Accept-Ranges", "bytes");

                                                                  

                  //lo escribimos

                  OutputStream out = response.getOutputStream();

                  out.write(b); 

                  out.close();                     

                  raf.close();

                  fis.close();

                  fr.close();

                                   

                  }

               catch (FileNotFoundException fe)

                  {

                     throw new Exception();

                  }

           }

       }

       catch(Exception e) {

            System.out.println(e.getMessage());

            //salida a pagina de error y devolver foto por defecto

                         

           //leemos el fichero del ftp por defecto

           File f = new File(Constants.FotoPathDefault); //Const..Default à Es un _String con la url

           RandomAccessFile raf = new RandomAccessFile(Constants.FotoPathDefault, "r");

           FileInputStream fis = new FileInputStream(f);

           FileReader fr = new FileReader(f);

           int i;

           byte b[] = new byte[(int) f.length()];

           raf.read(b);

                                 

           //cabecera

           response.setHeader("Content-Type","img/jpeg");

           response.setIntHeader("Content-Length", (int) f.length());

           //response.setHeader("Accept-Ranges", "bytes");

                                                           

           //lo escribimos

           OutputStream out = response.getOutputStream();

           out.write(b); 

           out.close(); 

           raf.close();

           fis.close();

           fr.close();

     } //catch

} //doGet          

}

 


admin @ 15:16 | comentarios (0) | Links Permanentes



<< December 2005 >>
Sun Mon Tue Wed Thu Fri Sat
  1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
 

archivos

November - 2013
October - 2013
July - 2013
June - 2013
May - 2013
April - 2013
March - 2013
February - 2013
November - 2010
October - 2010
September - 2010
August - 2010
June - 2010
November - 2009
October - 2009
September - 2009
March - 2009
February - 2009
January - 2009
September - 2008
May - 2008
April - 2008
November - 2007
October - 2007
May - 2007
April - 2007
March - 2007
February - 2007
January - 2007
December - 2006
September - 2006
August - 2006
June - 2006
May - 2006
April - 2006
February - 2006
January - 2006
December - 2005
November - 2005

powered by SimpleBlog 2.0

rss feed




Ir a Blog de Recetas de Cocina