feed twitter facebook LinkedIn facebook

XSLT » Ordenando un fichero XML

Noviembre 28, 2009 por Víctor Cuervo . 5804 visitas 3 Comentarios Imprimir Imprimir

Cada día tratamos más fuentes de información basadas en XML. Ficheros que intercambiamos, bases de datos basadas en XML o simplemente registros que contienen información variopinta.

Podemos apoyarnos en XSLT para dejar ordenado un fichero XML. Y al igual que cuando tratamos una base de datos, podemos dejarle ordenado por el campo que nosotros queramos.

Lo primero que tenemos que hacer es definir el XML sobre el que vamos a recuperar la información. Utilizaremos la misma estructura de libros que utilizamos en el resto de los ejemplos:

  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <libros>
  3. <libro>
  4. <titulo>Fuente Ovejuna</titulo>
  5. <autor>Lope de Vega</autor>
  6. <isbn>84-9815-002-7</isbn>
  7. </libro>
  8. <libro>
  9. <titulo>La Celestina</titulo>
  10. <autor>Fernando de Rojas</autor>
  11. <isbn>84-96390-96-9</isbn>
  12. </libro>
  13. <libro>
  14. <titulo>Don Juan Tenorio</titulo>
  15. <autor>Jose Zorilla</autor>
  16. <isbn>84-96390-97-7</isbn>
  17. </libro>
  18. </libros>

En primer lugar vamos a recorrer los elementos que queremos mostrar. En nuestro caso mostraremos los libros y autores de los mismos. Esto lo podemos llevar a cabo con la etiqueta xsl:for-each, la cual, mediante el atributo select demarca el path del documento XML sobre el que queremos iterar. El path elegido será libros/libro.

En el caso de que queramos recuperar los valores de un elemento en concreto utilizamos la etiqueta xsl:value-of. En este etiqueta, al igual que en la etiqueta xsl:for-each, el atributo select nos indicará el elemento a recuperar.

Al final nos quedará un código como el que vemos:

  1. <xsl:for-each select="libros/libro">
  2.  
  3.  
  4. Titulo:<xsl:value-of select="titulo"/><br/>
  5. Autor:<xsl:value-of select="autor"/>
  6.  
  7.  
  8. </xsl:for-each>

Vemos que nuestro documento XSLT combina etiquetas de transformación (etiquetas del namespace xsl) y etiquetas XHTML que conformarán el documento definitivo, obtenido tras la transformación.

Si solo ponemos este código, nos saldrá la información, pero sin ordenar:

Mis Libros
Titulo:Fuente Ovejuna
Autor:Lope de Vega
Titulo:La Celestina
Autor:Fernando de Rojas
Titulo:Don Juan Tenorio
Autor:Jose Zorilla
Titulo:Lazarillo de Tormes
Autor:Anonimo
Titulo:Fortunata y Jacinta
Autor:Benito Perez Galdos
Titulo:La Colmena
Autor:Camilo Jose Cela

Para ordenar los elementos utilizamos la etiqueta xsl:sort. Esta etiqueta tiene un atributo select que indica el path sobre el que queremos ordenar. Así, si queremos ordenar por nombre del titulo pondríamos la siguiente línea de código:

  1. <xsl:sort select="titulo"/>

Quedándonos el siguiente listado:

Mis Libros
Titulo:Don Juan Tenorio
Autor:Jose Zorilla
Titulo:Fortunata y Jacinta
Autor:Benito Perez Galdos
Titulo:Fuente Ovejuna
Autor:Lope de Vega
Titulo:La Celestina
Autor:Fernando de Rojas
Titulo:La Colmena
Autor:Camilo Jose Cela
Titulo:Lazarillo de Tormes
Autor:Anonimo

Hay que tener cuidado ya que la ordenación (xsl:sort) tiene que estar dentro de la iteración de elementos (xsl:for-each).

JavaScript » Abrir una ventana que no se pueda redimensionar

Noviembre 10, 2009 por Víctor Cuervo . 3954 visitas 7 Comentarios Imprimir Imprimir

Una de las cosas que podemos hacer con el método .open() de Javascript a la hora de abrir una ventana en Javascript es forzar a que la nueva tenga un tamaño fijo y que además el usuario no pueda redimensionar.

Para ello simplemente tendremos que jugar con los valores de la características asociadas a la ventana.

Pero primero recordemos como es el método .open() del objeto Window:

  1. window.open (url:string,nombreVentana:string,caracteristicas :string)

De las características de la ventana nos centraremos en height y width para darle un tamaño fijo a la vetana y en resizable para que al abrir la ventana, esta no se pueda redimensionar.

En las dos primeras propiedades utilizamos el tamaño en pixeles, mientras que en la segunda utilizaremos el valor false como indicador para no redimensionar.

El código que nos quedará será el siguiente:

  1. window.open("http://www.w3api.com", "nuevo", "width=400,height=400,resizable=false");

Una pequeña línea de código en Javascript que nos puede ser muy útil.

XSLT » Filtrar información en una XSLT

Noviembre 6, 2009 por Víctor Cuervo . 4820 visitas 1 Comentario Imprimir Imprimir

Nuestras hojas de transformación no se tienen que limitar a recuperar toda la información de un fichero XML y a ponerla en otro tipo de formato. Puede ser que cierta información del documento no nos interese, o tenga que ser evaluada. Es por ello que puede darse el caso de que necesitemos filtrar información en una XSLT.

Para poder realizar esa evaluación de datos nos podemos apoyar en estructuras condicionales como xsl:if, xsl:choose y las funciones que tiene el lenguaje XSL.

Siguiendo al resto de los ejemplos XSLT de nuestra web, vamos a utilizar el fichero XML con los datos de los libros. Pero en este caso vamos a añadir un nuevo campo en la estructura. Este nuevo campo será el precio del libro. El fichero de libros nos quedará así:

  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <libros>
  3. <libro>
  4. <titulo>Fuente Ovejuna</titulo>
  5. <autor>Lope de Vega</autor>
  6. <isbn>84-9815-002-7</isbn>
  7. <precio>24</precio>
  8. </libro>
  9. <libro>
  10. <titulo>La Celestina</titulo>
  11. <autor>Fernando de Rojas</autor>
  12. <isbn>84-96390-96-9</isbn>
  13. <precio>32</precio>
  14. </libro>
  15. ...
  16. </libros>

La condición de nuestra hoja de transformación será el generar un listado de libros, pero siempre y cuando, estos, tengan un precio superior o igual a 30 euros.

Para ello lo primero que tenemos que hacer es mostrar el listado de libros. Esto lo conseguimos con una estructura repetitiva del tipo xsl:for-each. En medio de esta estructura, utilizando etiquetas xsl:value-of mostramos la información del titulo del libro, autor y precio del mismo. Tendremos el siguiente código:

  1. <xsl:for-each select="libros/libro">
  2.  
  3.  
  4. Titulo:<xsl:value-of select="titulo"/><br/>
  5. Autor:<xsl:value-of select="autor"/><br/>
  6. Precio:<xsl:value-of select="precio"/>
  7.  
  8.  
  9. </xsl:for-each>

El código anterior nos va a sacar todos los libros que tengamos definidos en nuestra estructura XML. Todavía no hemos ejecutado el filtro. Para aplicar el filtro utilizamos la etiqueta xsl:if. Antes de utilizarla refrescaremos cual es su estructura

  1. <xsl:if test="condicion"> ... </xsl:if>

Como podemos ver, el atributo test es el que nos permite evaluar la condición. Como condición podemos utilizar cualquiera de las funciones que nos da el lenguaje XSLT o simplemente comparar valores de elementos del documento XML contra constantes. Este último caso será el nuestro. Y es que nosotros contrastaremos el valor de un elemento del documento, el precio, contra una constante, 24 (euros € o dolares $ ;-) ) Quedándonos al final esta línea de código:

  1. <xsl:if test="precio&gt;24"> ... </xsl:if>

En el medio de esta decisión pondremos la extracción de información del libro, es decir, los xsl:value-of. Nuevamente, quedándonos:

  1. <xsl:for-each select="libros/libro">
  2. <xsl:if test="precio>=30">
  3.  
  4.  
  5. Titulo:<xsl:value-of select="titulo"/><br/>
  6. Autor:<xsl:value-of select="autor"/><br/>
  7. Precio:<xsl:value-of select="precio"/>
  8.  
  9.  
  10. </xsl:if>
  11. </xsl:for-each>

Download » Descargas Noviembre.09

Noviembre 1, 2009 por Víctor Cuervo . 4503 visitas 2 Comentarios Imprimir Imprimir

logo_aulambraA continuación vemos los ficheros para descargar los artículos del último mes. El resto los podéis encontrar en http://code.google.com/p/lineadecodigo/.

Los artículos que se han añadido han sido de las tecnologías:

Podéis consultar la lista de descargas actualizada en http://code.google.com/p/lineadecodigo/downloads/list

Java » Alinear cadena a la izquierda

Noviembre 1, 2009 por Víctor Cuervo . 4090 visitas 2 Comentarios Imprimir Imprimir

Seguimos con los ejemplos de transformación de cadenas y después de ver cómo añadir ceros a la izquierda, ahora veremos como podemos alinear una cadena a la izquierda.

Para ello vamos a volver a utilizar la clase Formatter y el método format(). Aunque podríamos utilizar el método format directamente sobre la clase String. Veremos el ejemplo de las dos formas, ya que lo importante es el patrón de formato a aplicar.

Con la clase Formatter, lo primero será instanciarla.

  1. Formatter fmt = new Formatter();

Lo siguiente ya será aplicar el formato:

  1. Formatter fmt = new Formatter();
  2. fmt = fmt.format("Contenido %-8d unidades", number);

El formato para alinear la cadena a la izquierda lo conseguiremos mediante el flag '-'. Si recordamos el formato de la cadena de conversión sería el primer valor tras el del argumento.

%[argument_index$][flags][width]conversion

Para ver la justificación le damos un tamaño de 8 posiciones y el tipo de conversión será el 'd' para los números enteros. El código sería el siguiente:

  1. int number = 4752;
  2. Formatter fmt = new Formatter();
  3. fmt = fmt.format("Contenido %-8d unidades", number);
  4. System.out.println(fmt.toString());

Si queremos hacer esto directamente, sin la clase Formatter, sería utilizar el método format de la siguiente forma:

  1. String formateado = String.format("Contenido %-8d unidades", number);
  2. System.out.println(formateado);