Formato de una hoja de estilos
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
java org.apache.xalan.Process -in f.xml -xsl h.xsl
xsltproc hoja.xsl f.xml
xml tr hoja.xsl f.xml
java net.sf.saxon.Transform f.xml h.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<head>
<title>Ejemplo</title>
</head>
<body>
<h1>Poema</h1>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Las reglas de plantillas (templates) se identifican mediante:
<xsl:template match="...">
...resultado...
</xsl:template>
El valor del atributo match
es una expresión
XPath
Cuando el procesador encaja el nodo actual con la expresión genera el valor de la plantilla
Es posible indicar en el documento XML qué hoja de estilos lleva asociada
Un navegador puede reconocer dicha información y mostrar el resultado de la transformación
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl" ?>
<poema fecha="Abril de 1915" lugar="Granada">
<titulo>Alba</titulo>
<verso>Mi corazon oprimido</verso>
<verso>late junto a la alborada</verso>
. . .
</poema>
<xsl:template match="poema">
Fecha: <xsl:value-of select="@fecha"/>,
Lugar: <xsl:value-of select="@lugar"/>
</xsl:template>
Por defecto, el procesador lee el documento y recorre el árbol según el orden de los nodos
apply-templates
permite indicar al procesador que
continúe procesando ciertas reglas de plantillas
<xsl:template match="poema">
Versos: <xsl:apply-templates select="verso" />
Titulo: <xsl:apply-templates select="titulo" />
</xsl:template>
apply-templates
sin argumentos selecciona
todos los hijos del nodo actual.
Es posible indicar varios modos de recorrido
<xsl:template match="/">
Contenidos:
<ul><xsl:apply-templates mode="cont" /></ul>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="poema" mode="cont">
<li><xsl:value-of select="titulo" /></li>
</xsl:template>
<xsl:template match="poema">
...
</xsl:template>
Las plantillas predefinidas tienen la menor prioridad posible
Pueden re-definirse por la aplicación
<xsl:template match="text()|@*">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="*|/">
<xsl:value-of apply-templates />
</xsl:template>
Nota: Esta plantilla funciona para cualquier modo
Las instrucciones de procesamiento, comentarios y espacios de nombre se ignoran
<xsl:template match="processing-instruction()|comment()" />
Todos los elementos que no pertenezcan al espacio de nombres de XSLT son generados en el árbol de resultado.
Se añaden todas las declaraciones de espacios de nombres utilizadas
Excepciones:
extension-element-prefixes
permite
indicar que ciertos prefijos de espacios de nombres son
instrucciones y que no forman parte del árbol de resultadoexclude-result-prefixes
permite
omitir espacios de nombresnamespace-alias
.
Útil para generar hojas de estilosMediante element
puede definirse un elemento
nuevo.
<xsl:template match="poema">
<xsl:element name="h1">
<xsl:value-of select="titulo" />
</xsl:element>
</xsl:template>
Puede especificarse el espacio de nombres del elemento
mediante el atributo namespace
Mediante attribute
puede definirse un atributo
nuevo.
<enlace
url="http://www.uniovi.es">
Universidad</enlace>
<xsl:template match="enlace">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<a
href="http://www.uniovi.es">
Universidad</a>
Puede especificarse el espacio de nombres mediante
el atributo namespace
Mediante {...}
es posible
incluir expresiones XPath en un atributo que son evaluadas
al generar el resultado.
<enlace
url="http://www.uniovi.es">
Universidad</enlace>
<xsl:template match="enlace">
<a href="{@url}">
<xsl:value-of select="." />
</a>
</xsl:template>
<a
href="http://www.uniovi.es">
Universidad</a>
Mediante attribute-set
pueden definirse
conjuntos de atributos para su reutilización
posterior
<xsl:attribute-set name="img-grande">
<xsl:attribute name="width">250px</xsl:attribute>
<xsl:attribute name="height">250px</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="img-peque">
<xsl:attribute name="width">50px</xsl:attribute>
<xsl:attribute name="height">50px</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="imagen" mode="cont">
<img xsl:use-attribute-sets="img-peque" src="{@src}" />
</xsl:template>
Mediante text
se puede incluir texto
<xsl:template match="poema">
<h1>Titulo: <xsl:value-of select="titulo"/></h1>
<h2>Fecha y lugar:
<xsl:value-of select="@fecha" />
<xsl:text> </xsl:text>
<xsl:value-of select="@lugar" />
</h2>
</xsl:template>
Para añadir comentarios al resultado se utiliza
comment
<xsl:template match="/">
<poema>
<xsl:comment>Generado mediante XSLT</xsl:comment>
<xsl:apply-templates />
</poema>
<xsl:template>
<poema>
<!-- Generado mediante XSLT -->
...
</poema>
Para añadir instrucciones de procesamiento se
utiliza processing-instruction
<xsl:template match="/">
<xsl:processing-instruction
name="xml-stylesheet">
href="poema.xsl"
type="text/xsl"
</xsl:processing-instruction>
<?xml-stylesheet href="poema.xsl" type="text/xsl"?>
Mediante copy
es posible crear una copia
del nodo actual
No se copian los atributos ni los hijos salvo que se
especifique mediante apply-templates
<xsl:template match="titulo|verso">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
copy-of
permite indicar los nodos que
serán copiados al resultado mediante el atributo select
<xsl:template match="poema">
<xsl:copy-of select="." />
</xsl:template>
La siguiente hoja de estilos toma un documento XML y devuelve como resultado el mismo documento.
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version="1.0" >
<xsl:template
match="@*|*|processing-instruction()|comment()">
<xsl:copy>
<xsl:apply-templates
select="*|@*|text()|processing-instruction()|comment()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Crear una hoja de estilos que tome un documento XML y devuelva el mismo documento tras eliminar las instrucciones de procesamiento.
NOTA: Deben dejarse el resto de nodos: comentarios, elementos, atributos, etc. tal y como estaban.
xsl:if
establece una condición para
generar el resultado
NOTA: No tiene else
<xsl:template match="poema">
<xsl:if test="@lugar='Granada'">
<xsl:comment>Granada</xsl:comment>
</xsl:if>
<xsl:apply-templates />
</xsl:template>
xsl:choose
selecciona entre varias alternativas
<xsl:template match="poema">
<xsl:choose>
<xsl:when test="@lugar='Granada'">
<xsl:comment>Granada</xsl:comment>
</xsl:when>
<xsl:when test="@lugar='Oviedo'">
<xsl:comment>Oviedo</xsl:comment>
</xsl:when>
<xsl:otherwise>
<xsl:comment>Otro lugar</xsl:comment>
</xsl:otherwise>
</xsl:template>
for-each
repite un procesamiento
para un conjunto de nodos
<xsl:template match="poema">
<ul>
<xsl:for-each select="verso">
<li><xsl:value-of select="." /></li>
</xsl:for-each>
</ul>
</xsl:template>
NOTA: No es un bucle for
convencional
Crear una hoja de estilos que tome un documento que represente un libro y genere una página Web.
Como ejemplo, puede utilizarse el documento siguiente
Crear una hoja de estilos que tome un documento que represente una lista de alumnos con sus respectivas notas y las formatee en una página Web.
Como ejemplo, puede utilizarse el documento siguiente
mailto:
en
cada una de las direcciones de los alumnosCrear un vocabulario que represente eventos
Cada evento tendrá asociada la siguiente información:
Crear un documento de ejemplo de eventos
Crear una hoja de estilos que transforme documentos con eventos en formato HTML
Crear una hoja de estilos que convierta documentos en formato Atom en documentos en el formato de eventos desarrollado en el ejercicio anterior
variable
permite declarar una variable
NOTA: Los valores de las variables no pueden modificarse = Programación declarativa!
<xsl:template match="rectangulo">
<xsl:variable name="area" select="@base * @altura" />
El area es
<xsl:value-of select="$area" /> y
el doble del area es
<xsl:value-of select="$area * 2" />
</xsl:template>
Lo que no se puede hacer es:
<xsl:variable name="area" select="$area = $area * 2"/>
Mediante param
pueden definirse parámetros
de la hoja de estilos. Son similares a las variables.
La principal diferencia es que los parámetros toman valores por defecto que pueden ser alterados cuando la plantilla o la hoja de estilo es invocada
<xsl:param name="hazIndice">SI</xsl:param>
<xsl:template match="/">
<xsl:if test="$hazIndice = 'SI'">
<xsl:apply-templates mode="indice" />
</xsl:if>
<xsl:apply-templates/>
</xsl:template>
Mediante el atributo name
es posible asociar
un nombre a una plantilla
Para invocar la plantilla se utiliza
call-template
Se pueden pasar parámetros
mediante with-param
<xsl:template name="suma">
<xsl:param name="a" />
<xsl:param name="b" />
<xsl:value-of select="$a + $b" />
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="suma">
<xsl:with-param name="a" select="2" />
<xsl:with-param name="b" select="3" />
</xsl:call-template>
</xsl:template>
<xsl:template name="fact">
<xsl:param name="n" />
<xsl:choose>
<xsl:when test="$n=0">1</xsl:when>
<xsl:otherwise>
<xsl:variable name="r">
<xsl:call-template name="fact">
<xsl:with-param name="n" select="$n - 1"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$n * $r" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Crear una hoja de estilos que tome un número n
y genere una lista de n
items
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
...
</ul>
Crear una hoja de estilos que tome un número n
y genere una tabla HTML de n
filas y n
columnas
Crear una hoja de estilos que tome un documento y substituya todas las apariciones de una cadena de texto por otra.
Crear una hoja de estilos que tome como argumento un mes y un año y genere un calendario. Puede partirse del siguiente documento XML y de la siguiente hoja de estilos
Crear una hoja de estilos que represente documentos de eventos en un calendario
XSLT es un lenguaje pensado para transformar documentos XML
message
muestra un mensaje. Puede ser útil
para depuración. El atributo terminate
permite indicar
al procesador que aborte la ejecución
<xsl:template name="imagen">
<xsl:if test="not(@href)">
<xsl:message terminate="yes">
No se encuentra valor de href en imagen
</xsl:message>
...
</xsl:template>
sort
realiza una clasificación del conjunto de nodos
Puede utilizarse más de un criterio de clasificación
<xsl:template match="alumnos">
<xsl:for-each select="alumno">
<xsl:sort select="apellidos" />
<xsl:sort select="nombre" />
<p><xsl:value-of select="apellidos" />,
<xsl:value-of select="nombre" /></p>
</xsl:for-each>
</xsl:template>
El atributo data-type
permite indicar la forma de clasificación:
number
: numéricatext
: textual (por defecto)El atributo order
indica el tipo de clasificación:
ascending
: ascendente (por defecto)descending
: descendente
<xsl:template match="alumnos">
<xsl:for-each select="alumno">
<xsl:sort select="nota"
data-type="number"
order="descending"/>
<p><xsl:value-of select="apellidos" /></p>
</xsl:for-each>
</xsl:template>
El elemento number
permite insertar un número formateado
en el resultado
<xsl:template match="alumnos">
<xsl:for-each select="alumno">
<xsl:sort select="apellidos"/>
<p>
<xsl:number value="position()" format="1. "/>
<xsl:value-of select="apellidos"/>,
<xsl:value-of select="nombre"/>
</p>
</xsl:for-each>
</xsl:template>
Los atributos de number
permiten modificar el
formato de la numeración
level
indica nivel de numeración (multiple
, single
ó any
)count
indica qué valores en dichos niveles.from
indica desde dónde empezar la numeraciónformat
indica formato. Ejemplos: 1.
, a.
, I.
, 001.
, etc. El elemento number-format
especifica el formato del número
Los atributos para controlar el formato de salida son:
decimal-separator
grouping-separator
percent
per-mille
zero-digit
digit
pattern-separator
infinity
NaN
minus-sign
La función id
permite seleccionar un
elemento con un identificador determinado
Puede ser útil para buscar elementos
Limitación: requiere declarar atributo como ID
en la DTD
<dibujos>
<colores>
<color id="rojo">255,0,0</color>
<color id="azul">0,0,255</color>
...
</colores>
<cuadro color="rojo" .../>
<cuadro color="verde" .../>
...
</dibujos>
<xsl:template match="cuadro">
<svg:rect
fill=
"rgb({id(@color)})"
... />
</xsl:template>
El ejemplo anterior puede realizarse mediante una búsqueda completa
Limitación: la búsqueda completa es poco eficiente
<dibujos>
<colores>
<color id="rojo">255,0,0</color>
<color id="azul">0,0,255</color>
...
</colores>
<cuadro color="rojo" .../>
<cuadro color="verde" .../>
...
</dibujos>
<xsl:template match="cuadro">
<xsl:variable
name="color"
select="@color" />
<svg:rect
fill=
"rgb({/dibujos/colores/color
[@id=$color]})"
... />
</xsl:template>
xsl:key
permite optimizar la búsqueda de información en
un documento XML mediante la creación de índices
<dibujos>
<colores>
<color id="rojo">255,0,0</color>
<color id="azul">0,0,255</color>
...
</colores>
<cuadro color="rojo" .../>
<cuadro color="verde" .../>
...
</dibujos>
<xsl:key name="claveColor"
match="color"
use="@id" />
<xsl:template match="cuadro">
<svg:rect
fill=
"rgb({key('claveColor',
@color)})"
... />
</xsl:template>
La función generate-id()
permite generar un identificador
único. Toma como argumento un nodo y devuelve un identificador
asociado a dicho nodo.
Puede ser útil para generación de tablas de contenidos
<xsl:template match="poema" mode="cont">
<li><a href="#{generate-id(.)">
<xsl:value-of select="titulo" />
</a></li>
</xsl:template>
<xsl:template match="poema">
<a name="generate-id(.)">
...
</a>
</xsl:template>
xsl:include
permite incluir otra hoja de estilos.
La inclusión actúa como si se hubiese tecleado diréctamente la hoja incluida en dicho lugar.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="otraHoja.xsl" />
...
</xsl:stylesheet>
xsl:import
importa el contenido de otra hoja de
estilos en el documento actual.
Las plantillas de la hoja importada tienen menor prioridad que las plantillas de la hoja principal.
La instrucción import
debe aparecer al comienzo
de la hoja de estilos. No se permite recursividad
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="otraHoja.xsl" />
...
</xsl:stylesheet>
La función document()
permite acceder al contenido de
otros documentos XML.
El argumento es la URI del documento a acceder. Si no tiene argumentos, se accede al documento de la hoja de estilos
<xsl:template match="verAlumnos">
<xsl:for-each
select="document('alumnos.xml')/alumnos/alumno">
<p><xsl:value-of select="nota"/></p>
</xsl:for-each>
</xsl:template>
El elemento output
permite controlar el formato
del resultado. Puede tener los siguientes atributos:
method
: indica el tipo de documento a generar. Puede ser
xml
, text
ó html
encoding
: especifica la codificación del resultadoomit-xml-declaration
: permite eliminar la declaración
XMLdoctype-public
y doctype-system
especifican la
DTD del resultadostandalone
indica si el resultado es standalone o no.cdata-section-elements
indica los elementos cuyo resultado
se generará mediante secciones CDATAFin de la presentación