XPath en XSL Stylesheets
Para que sea más claro el uso de XPath, los siguientes ejemplos están basados en el fragmento XML que se muestra a continuación:
<?xml version="1.0"?>
<CentroRecreativo>
<Miembro nivel="basica">
<Nombre>José </Nombre>
<Telefono tipo="casa">5555-1234</Telefono>
<Telefono tipo="trabajo">5555-4321</Telefono>
<Casilla>8700</Casilla>
</Miembro>
<Miembro nivel="premier">
<Nombre>David</Nombre>
<Telefono tipo="casa">3838-1234</Telefono>
<Telefono tipo="trabajo">3838-4321</Telefono>
<Casilla>5600</Casilla>
</Miembro>
</CentroRecreativo>
|
El siguiente template
extrae el valor del elemento Nombre
:
<xsl:template match="CentroRecreativo">
Bienvenido <xsl:value-of select="Miembro/Nombre"/>
</xsl:template>
|
Nótese que dentro del template
de CentroRecreativo
se descendió al elemento Nombre
; el siguiente template
demuestra como extraer el valor de un atributo:
<xsl:template match="CentroRecreativo">
Bienvenido <xsl:value-of select="Miembro/Nombre"/>
Su teléfono en casa es: <xsl:value-of select="Miembro/Telefono[@tipo='casa']"/>
</xsl:template>
|
También es posible ascender a un elemento dentro de la estructura XML através de XPath:
<xsl:template match="Casilla">
La casilla <xsl:value-of select="."/>
esta asignada a <xsl:value-of select="../Nombre"/>
</xsl:template>
|
Para extraer un atributo cuando se esta dentro de un nodo especifico:
<xsl:template match="Miembro">
Bienvenido <xsl:value-of select="Nombre"/>
Su membresía es tipo <xsl:value-of select="@nivel"/>
</xsl:template>
|
Además es posible definir un template
para que éste sea aplicado a diversos elementos del documento XML, lo anterior se realiza mediante el símbolo |
que indica un condicional (OR) en XPath :
<xsl:template match="Nombre|Casilla">
<xsl:value-of select="."/>
</xsl:template>
|
Los elementos XPath antes mencionados representan los más utilizados en "XSL Stylesheets" y entre los más comunes para navegar documentos XML, sin embargo, XPath posee una sintaxis extensa, que aunque no utilizada en muchos casos, ofrece diversas alternativas para navegar elementos XML, dichas variaciones son descritas en la siguiente tabla:
Sintaxis | Funcionamiento |
//Miembro |
Seleccionaría todos los elementos Miembro del documento
|
//* |
Indica la selección de todos los elementos del fragmento XML, empezando de su nodo raíz.
|
/CentroRecreativo/Miembro/* |
Seleccionaría todos los elementos anidados ("child") del elemento Miembro .
|
/Miembro/Telefono[1] |
Através de corchetes ([..] ) en XPath se especifica una selección determinada, en este caso se esta indicando el primer elemento Telefono anidado en el elemento Miembro .
|
/CentroRecreativo/Miembro[2]/Telefono[2] |
Seleccionaría el segundo elemento Telefono ubicado en el segundo elemento Miembro , partiendo de CentroRecreativo
|
Otra facilidad que ofrece XPath son una serie de funciones que varían desde la navegación del documento (para ser utilizadas en conjunción de la sintaxis antes descrita), hasta la manipulación de String's y elementos numéricos, dichas funciones son descritas a continuación :
Función de Navegación | Funcionamiento |
count(Miembro) |
La función count() es empleada para generar el numero de elementos en cuestión; en este caso el resultado sería 2, ya que existen dos elementos llamados Miembro .
|
last(Miembro) |
El método last() selecciona el último elemento indicado en su estructura; en este caso correspondería al segundo elemento Miembro , dicha función proporciona el mismo comportamiento que el uso corchetes ([..] ), sin la necesidad de conocer anticipadamente el número de elementos presentes.
|
position(Miembro) |
La función position() genera el numero del elemento que esta siendo procesado; en este caso el resultado podría ser 1 o 2, dependiendo del elemento Miembro que este siendo procesado.
|
namespace-uri(CentroRecreativo) |
La función namespace-uri() es empleada para generar el Namespace del elemento en cuestién, retornando el URI del mismo en caso de existir.
|
XML con Números y Strings
Vale mencionar que aunque existan funciones para manipular números y string's en XPath, éstas no representan las mejores practicas de diseño, por la misma naturaleza de XML que es un lenguaje de marcación.
Generalmente las manipulaciones a ese nivel (números o caracteres) son mejor realizadas en el ambiente de programación pre-XML (Java, C#, Perl u otro).
|
Función de String | Funcionamiento |
concat('XML',' y XPath') |
La función concat() concatena sus valores de entrada; el caso anterior generaría el String: 'XML y XPath' .
|
contains('osmosislatina','osmosis') |
La función contains() es utilizada para verificar si determinado String (primer dato de entrada) contiene cierta secuencia (segundo dato de entrada) ; el ejemplo anterior retornaría verdadero (true ) ya que osmosis se encuentra en el String osmosislatina ; NOTA: El resultado de esta función siempre da un resultado booleano (true /false ) .
|
normalize-space(' Uso de XPath ') |
El método normalize-space() es utilizado para eliminar los espacios al inicio y fin de un String; el caso anterior modifica el String a simplemente 'Uso de XPath' .
|
string-length('CentroRecreativo') |
La función string-length() genera el numero de caracteres del String indicado; la declaración anterior resulta en 16.
|
substring('CentroRecreativo', 1, 6) |
La función substring() genera una secuencia a partir del String proporcionado (primer dato de entrada), partiendo de un carácter (segundo dato de entrada) y terminando en otra posición (tercer datos de entrada) ; el ejemplo anterior genera el String Centro .
|
substring-after('3838-4321','-') |
La función substring-after genera una secuencia con los caracteres posteriores a determinado String partiendo de otro String original; el caso anterior generaría el String: 4321 .
|
substring-before('5555-1234','-') |
La función substring-before genera una secuencia con los caracteres previos a determinado String partiendo de otro String original; el caso anterior generaría el String: 5555 .
|
translate('todo','to','na') |
La función translate() convierte todos los elementos en determinado String (primer dato de entrada), basado en una secuencia original (segundo dato de entrada) hacia caracteres alternos (tercer dato de entrada) ; el caso anterior generaría el String: 'nada' , todo carácter t es substituido por n y todo carácter o por a .
|
Función/ Expresión Numérica | Funcionamiento |
+ |
Representa el signo para realizar una suma
|
- |
Representa el signo para realizar una resta
|
* |
Representa el signo para realizar una multiplicación
|
div |
El vocablo div es utilizado para realizar una división
|
12 mod 5 |
mod representa el residuo de una operación ; la declaración anterior generaría 2.
|
ceiling(3.2) |
La función ceiling() genera el techo ("ceiling") de un numero decimal, en términos matemáticos esto implica el numero entero superior al presente; el ejemplo anterior generaría 4
|
floor(6.7) |
La función floor() genera el piso ("floor") de un numero decimal, en términos matemáticos esto implica el numero entero inferior al presente; el ejemplo anterior generaría 6
|
number('7') |
La función number() convierte un String a número para que puedan ser realizadas operaciones matemáticas.
|
round(9.3) |
La función round redondea un numero, en términos matemáticos esto implica el numero entero inferior al presente si la decimal es menor a .5 , o bien, el numero entero superior al presente si su decimal es .5 o superior; el ejemplo anterior generaría 9
|
sum(Miembro/Casilla) |
La función sum() realiza una sumatoria sobre los elementos proporcionados; la declaración anterior generaría la sumatoria de todos los valores presentes en los elementos Casilla .
|
Función/ Expresión Condicional (Booleana) | Funcionamiento |
not(expresión) |
La función not() genera la negación de la expresión proporcionada, esto es, si la expresión resulta verdadera (true ) la función generaría un resultado falso (false ), y viceversa.
|
!= |
Representa una desigualdad entre dos elementos, si ambos elementos son iguales resulta verdadera (true ), caso contrario false (false ) |
< |
Representa una comparación menor que entre dos elementos, resultando en un valores verdadero (true ) o falso (false ) según la comparación.
|
<= |
Representa una comparación menor que o igual entre dos elementos, resultando en un valores verdadero (true ) o falso (false ) según la comparación.
|
> |
Representa una comparación mayor que entre dos elementos, resultando en un valores verdadero (true ) o falso (false ) según la comparación.
|
>= |
Representa una comparación mayor que o igual entre dos elementos , resultando en un valores verdadero (true ) o falso (false ) según la comparación.
|
or |
Representa una condicional entre dos elementos, si cualquiera de estos elementos es verdadero (true ) la condicional también resulta verdadera (true ), en caso contrario resulta falsa (false ).
|
and |
Representa una unión entre dos elementos, solo sí ambos elementos son verdaderos (true ) resulta verdadera (true ) la unión, en caso contrario la unión resulta falsa (false ).
|