Cada uno de los siguientes elementos desempeña un papel vital en la transformación de documentos XML a través de XSLT, permitiendo una gran flexibilidad y potencia en la manipulación y presentación de datos XML.
El elemento <xsl:value-of> en XSLT es utilizado para extraer el valor de un nodo especificado del documento XML de entrada y añadir ese valor al flujo de salida del documento transformado. Es uno de los elementos más fundamentales en XSLT, ya que te permite insertar los valores de los elementos o atributos XML en el resultado de la transformación.
select: Es el atributo más importante de <xsl:value-of>. Utiliza una expresión XPath para seleccionar el nodo o el conjunto de nodos cuyo valor quieres extraer. Este atributo determina exactamente qué datos se recuperan del documento XML de entrada.
<xsl:value-of select="expresiónXPath"/>
<xsl:template match="/persona">
<html>
<body>
<p>Nombre: <xsl:value-of select="nombre"/></p>
</body>
</html>
</xsl:template>
El elemento <xsl:for-each> en XSLT es una instrucción de control que se utiliza para iterar sobre un conjunto de nodos seleccionados del documento XML de entrada. Dentro de <xsl:for-each>, puedes aplicar plantillas de transformación a cada nodo del conjunto seleccionado, uno por uno. Este elemento es especialmente útil cuando necesitas procesar o generar salida para cada nodo de un conjunto de nodos de manera individual.
select: Este es el atributo más importante de <xsl:for-each>. Utiliza una expresión XPath para seleccionar el conjunto de nodos sobre los cuales iterar. La expresión define cuáles nodos del documento XML de entrada serán procesados dentro del <xsl:for-each>.
<xsl:for-each select="expresiónXPath">
<!-- Instrucciones de transformación para cada nodo seleccionado -->
</xsl:for-each>
Fichero xml:
<libreria>
<libro>
<titulo>El Señor de los Anillos</titulo>
<autor>J.R.R. Tolkien</autor>
</libro>
<libro>
<titulo>Fundación</titulo>
<autor>Isaac Asimov</autor>
</libro>
<!-- Más libros -->
</libreria>
Fichero de transformación:
<xsl:template match="/libreria">
<html>
<body>
<h2>Lista de Libros</h2>
<ul>
<xsl:for-each select="libro">
<li>
<xsl:value-of select="titulo"/>
- <xsl:value-of select="autor"/>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
El elemento <xsl:sort> en XSLT es utilizado para ordenar un conjunto de nodos seleccionados antes de que sean procesados. Es comúnmente usado en combinación con <xsl:apply-templates> o <xsl:for-each> para definir cómo se deben ordenar los nodos resultantes de la selección. Este elemento permite especificar criterios de ordenamiento muy flexibles, incluyendo ordenar por el valor de texto de los nodos, valores de atributos, o incluso resultados de funciones.
select: Una expresión XPath que especifica el criterio de ordenamiento. Si se omite, el ordenamiento se realiza basado en el valor de cadena de los nodos seleccionados.
data-type: Especifica el tipo de datos según el cual se debe ordenar. Los valores pueden ser 'text' para ordenar alfabéticamente o 'number' para un ordenamiento numérico.
order: Define si el ordenamiento debe ser ascendente ('ascending', el valor por defecto) o descendente ('descending').
case-order: Permite especificar cómo se deben tratar las letras mayúsculas y minúsculas en el ordenamiento, con valores como 'upper-first' o 'lower-first'. Este atributo es especialmente útil cuando el ordenamiento es alfabético.
<xsl:for-each select="nodos-a-ordenar">
<xsl:sort select="criterio-de-ordenamiento" data-type="tipo-de-dato" order="orden"/>
<!-- Procesamiento de los nodos ordenados -->
</xsl:for-each>
Fichero xml:
<libreria>
<libro>
<titulo>Fundación</titulo>
<autor>Isaac Asimov</autor>
</libro>
<libro>
<titulo>El Señor de los Anillos</titulo>
<autor>J.R.R. Tolkien</autor>
</libro>
<libro>
<titulo>El juego de Ender</titulo>
<autor>Orson Scott Card</autor>
</libro>
</libreria>
Fichero de transformacion:
<xsl:template match="/libreria">
<html>
<body>
<h2>Libros</h2>
<xsl:for-each select="libro">
<xsl:sort select="titulo"/>
<p><xsl:value-of select="titulo"/> - <xsl:value-of select="autor"/></p>
</xsl:for-each>
</body>
</html>
</xsl:template>
El elemento <xsl:variable> en XSLT permite declarar una variable que se puede utilizar dentro de la hoja de estilos. Las variables en XSLT son inmutables, lo que significa que una vez que se asigna un valor a una variable, no se puede cambiar. Este comportamiento asegura que las transformaciones XSLT sean predecibles y libres de efectos secundarios.
name: Es obligatorio y define el nombre de la variable. Este nombre se utiliza para referenciar la variable en otras partes de la hoja de estilos.
select: Es opcional y permite asignar un valor a la variable mediante una expresión XPath. Si este atributo está presente, el cuerpo del elemento <xsl:variable> se ignora.
as (en XSLT 2.0 y superior): Especifica el tipo de datos de la variable. Este atributo es útil para asegurar que el valor de la variable sea del tipo esperado.
<xsl:variable name="nombreVariable" select="expresiónXPath"/>
Fichero XML:
<libreria>
<libro>
<titulo>El Señor de los Anillos</titulo>
<precio>22.50</precio>
</libro>
<libro>
<titulo>Fundación</titulo>
<precio>17.80</precio>
</libro>
</libreria>
Fichero de transformación:
<xsl:template match="/libreria">
<xsl:variable name="precioTotal" select="sum(libro/precio)"/>
<html>
<body>
<h1>Precio total de todos los libros: $<xsl:value-of select="$precioTotal"/></h1>
</body>
</html>
</xsl:template>
Aunque XSLT no es un lenguaje de programación con operaciones matemáticas o lógicas complejas directamente en variables como lo harías en lenguajes como Python o JavaScript, puedes realizar operaciones usando XPath dentro de la definición de la variable o en un contexto donde se utilice la variable. A continuación podemos ver un ejemplo sencillo:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="numero1" select="5"/>
<xsl:variable name="numero2" select="10"/>
<xsl:variable name="suma" select="$numero1 + $numero2"/>
<resultado>
<xsl:value-of select="$suma"/>
</resultado>
</xsl:template>
</xsl:stylesheet>
Es importante recordar que las variables en XSLT son inmutables: una vez que se les asigna un valor, este no puede ser cambiado. Si necesitas "modificar" el valor de una variable, usualmente necesitarás definir una nueva variable o ajustar tu enfoque de transformación.
El elemento <xsl:if> en XSLT es utilizado para aplicar condicionalmente una parte de la hoja de estilos basándose en la evaluación de una expresión.
Si la expresión se evalúa como verdadera (en el sentido de XPath, es decir, no retorna una cadena vacía, cero, false, o una secuencia vacía), entonces se procesa el contenido del <xsl:if>; de lo contrario, se ignora el contenido.
test: Este es el único atributo requerido para <xsl:if> y contiene una expresión XPath. Esta expresión es evaluada para cada nodo que coincide con el contexto en el que se usa <xsl:if>. Si el resultado es verdadero, se ejecutan las instrucciones dentro del elemento <xsl:if>.
<xsl:if test="expresiónXPath">
<!-- Instrucciones a ejecutar si la expresión es verdadera -->
</xsl:if>
Fichero XML:
<libros>
<libro publicado="true">
<titulo>El Señor de los Anillos</titulo>
</libro>
<libro publicado="false">
<titulo>El Hobbit (Borrador)</titulo>
</libro>
</libros>
Fichero de transformación:
<xsl:template match="/libros">
<html>
<body>
<h2>Libros Publicados</h2>
<ul>
<xsl:for-each select="libro">
<xsl:if test="@publicado='true'">
<li><xsl:value-of select="titulo"/></li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
El elemento <xsl:choose> es una estructura de control que se utiliza para realizar decisiones condicionales dentro de una hoja de estilo XSLT. Funciona de manera similar a las estructuras "if-else" en otros lenguajes de programación. Aquí te explico cómo se define <xsl:choose> junto con los elementos <xsl:when> y <xsl:otherwise>.
El elemento <xsl:choose> contiene uno o más bloques <xsl:when>, cada uno con una condición que debe evaluarse. Además, puede incluir un bloque <xsl:otherwise> al final para definir lo que sucede si ninguna de las condiciones <xsl:when> se cumple.
Cada elemento <xsl:when> incluye un atributo test, que contiene una expresión que se evalúa como verdadera o falsa. Si la condición es verdadera, se ejecutan las instrucciones dentro de este bloque y se ignora el resto de los bloques <xsl:when> y <xsl:otherwise> dentro del <xsl:choose>.
El elemento <xsl:otherwise> es opcional y se ejecuta si ninguno de los <xsl:when> anteriores tiene una condición verdadera. Funciona como el "else" en otras estructuras de control condicional.
Fichero xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:choose>
<!-- Condición 1 -->
<xsl:when test="@type='texto'">
<p>Es un texto.</p>
</xsl:when>
<!-- Condición 2 -->
<xsl:when test="@type='numero'">
<p>Es un número.</p>
</xsl:when>
<!-- Si ninguna condición anterior se cumple -->
<xsl:otherwise>
<p>Tipo desconocido.</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>