• No se han encontrado resultados

B. XSLT 2.0

B.3. Procesamiento push

elemento, incluso cuando son derivados de la misma declaración de espacio de nombre en el documento fuente.

Existen siete posibles formas para clasificar estos nodos. Podemos distinguir los que pueden tener hijos (nodos elemento y documento), los que pueden tener un padre (todos, excepto el nodo documento), los que tienen un nombre (elementos, atributos, espacio de nombre e instrucciones de procesamiento) o los que tienen su propio con- tenido textual (atributos, texto, comentarios, instrucciones de procesamiento y nodos de espacio de nombre). Puesto que cada uno de estos criterios da una jerarquía de clase posible diferente, el modelo XDM deja la jerarquía plana, y define todas estas características para todos los nodos. Donde una característica no es aplicable a un tipo de nodo particular, XDM define generalmente su valor como una secuencia vacía, aun- que a veces cuando se accede a la propiedad desde una expresión XPath real lo que se obtiene sea una cadena de longitud cero.

Por tanto, si utilizamos una jerarquía de clases en notación UML, obtendremos el dia- grama simplificado mostrado en la Figura B.2.

Figura B.2: Jerarquía de clases en UML de nodos en el Modelo de Árbol

En este diagrama, las cajas representan las clases o tipos, y la flecha representa una relación es-un-tipo-de, por ejemplo, un comentario es-un-tipo-de nodo.

B.3.

Procesamiento push

La forma más simple de procesar un árbol fuente consiste en escribir un regla de plantilla (template) para cada tipo de nodo que puede encontrarse, y para esa regla de plantilla para producir cualquier salida requerida, además de llamar a <xsl:apply-templates>para procesar los hijos de ese nodo.

B XSLT 2.0

El siguiente ejemplo extraído de [28] demuestra la técnica de procesamiento push: una hoja de estilos basada en reglas en la que hay una regla de plantilla para procesar cada tipo de nodo diferente.

El Listado B.1 muestra el documento fuente, books.xml, que es un simple catálogo de libros. Listado B.1: books.xml 1 <?xml version="1.0"?> 2 <books> 3 <book category="reference"> 4 <author>Nigel Rees</author> 5 <title>Sayings of the Century</title> 6 <price>8.95</price> 7 </book> 8 <book category="fiction"> 9 <author>Evelyn Waugh</author> 10 <title>Sword of Honour</title> 11 <price>12.99</price> 12 </book> 13 <book category="fiction"> 14 <author>Herman Melville</author> 15 <title>Moby Dick</title> 16 <price>8.99</price> 17 </book> 18 <book category="fiction"> 19 <author>J. R. R. Tolkien</author> 20 <title>The Lord of the Rings</title> 21 <price>22.99</price>

22 </book> 23 </books>

Supongamos que deseamos mostrar los datos del catálogo de libros de una forma concreta: una lista de libros enumerada secuencialmente. Para ello, debemos utilizar una hoja de estilos, books.xsl, como la que mostramos en el Listado B.2.

Listado B.2: books.xsl 1 <xsl:stylesheet version="2.0" 2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 3 4 <xsl:template match="books"> 5 <html><body>

6 <h1>A list of books</h1> 7 <table width="640"> 8 <xsl:apply−templates/> 9 </table> 10 </body></html> 11 </xsl:template> 12 13 <xsl:template match="book"> 14 <tr> 192

B.3 Procesamiento push 15 <td><xsl:number/></td> 16 <xsl:apply−templates/> 17 </tr> 18 </xsl:template> 19

20 <xsl:template match="author | title | price"> 21 <td><xsl:value−of select="."/></td>

22 </xsl:template> 23

24 </xsl:stylesheet>

En este caso, no hay una regla de plantilla para el nodo documento, por tanto, se invoca la plantilla por omisión. Ésta procesa todos los hijos del nodo documento. Hay un único hijo del nodo documento, el elemento <books>. Por tanto, la regla de plantilla para el elemento <book> se evalúa. Ésta crea algunos elementos HTML es- tándar en el árbol resultante, y eventualmente llama a <xsl:apply-templates/> para provocar que sus propios hijos sean procesados. Estos hijos son todos elemen- tos <book>, por ello, son todos procesados por la regla de plantilla cuya patrón de relación es match=“book”. Esta regla de plantilla produce un elemento <tr> HTML, y dentro un elemento <td>, que se rellena con la ejecución de la instrucción <xsl:number/> cuyo efecto es obtener el número de secuencia del nodo actual (el elemento <book>) dentro de su elemento padre. Entonces llama a <xsl:apply-templates/> otra vez para procesar los hijos del elemento <book> en el árbol fuente.

Los hijos del elemento <book> en el documento fuente son todos elementos <author>, <title>o <price>; por tanto, todos están relacionados con la regla de plantilla cu- yo patrón de relación es match=“author|title|price” (puede leerse | como “or”). Esta regla de plantilla produce un elemento <td> HTML que se rellena con la ejecución de una instrucción <xsl:value-of select=“.”/>. Esta instrucción evalúa una expresión XPath, y escribe su resultado (una cadena) como texto en el ár- bol resultante. La expresión es ., que devuelve el valor cadena del nodo actual, que es el contenido textual del elemento actual <author>, <price> o <title>.

Esta plantilla no llama a <xsl:apply-templates>, por tanto, sus hijos no serán procesados, y el control se devuelve hacia arriba.

En el Listado B.3 podemos comprobar la salida que se ha obtenido al aplicar la hoja de estilos books.xsl al documento fuente books.xml.

Listado B.3: output.html

1 <html> 2 <body>

3 <h1>A list of books</h1> 4 <table width="640"> 5 <tr>

B XSLT 2.0

7 <td>Nigel Rees</td>

8 <td>Sayings of the Century</td> 9 <td>8.95</td> 10 </tr> 11 <tr> 12 <td>2</td> 13 <td>Evelyn Waugh</td> 14 <td>Sword of Honour</td> 15 <td>12.99</td> 16 </tr> 17 ... 18 </table> 19 </body> 20 </html>

Este estilo de procesamiento se llama procesamiento push. Es dirigido por la instruc- ción <xsl:apply-templates>, como si el motor estuviese empujando los nodos fuera de la puerta, preguntando “si hay alguien interesado en relacionarse con éste”.