Está en la página 1de 10

TUTORIAL DE XPATH 2.

0 - Parte 1

En un entorno donde todas las tecnologas relacionadas con XML se
encuentran en constante expansin, es cada vez ms necesario
profesionales que tengan acabados conocimientos en ellas. Este tutorial es
una gua para que pueda conocer las funcionalidades que XPath puede
ofrecerle.

1. Introduccin
Debido a la estructura jerrquica de los Xml, al igual que la de los archivos y carpetas
en el disco, podra decirse que XPath es la versin para Xml de los paths que escribimos
para identificar archivos en una estructura de directorios. Tiene como fin el que
podamos definir un subconjunto de nodos de un xml para su posterior procesamiento.
Nos sirve para poder identificar partes especficas de un documento Xml.
Xml es ampliamente utilizado para transportar informacin debido a su alta
compatibilidad, sobre todo entre plataformas heterogneas. Es utilizado como un
aglutinante para interconectar aplicaciones y facilitar su interaccin, inclusive aquellas
que se encuentren geogrficamente separadas y que utilicen un medio en constante
evolucin como Internet para comunicarse. Cada vez se utiliza ms exhaustivamente y
con volmenes de informacin mayores, no solo para transportar informacin sino
tambin para almacenarla. A medida que crece la cantidad y variedad de informacin se
hacen necesarias tcnicas ms poderosas para encontrarla. Para cubrir esta necesidad
naci XPath el cual puede compararse con el lenguaje SQL que se utiliza para recuperar
informacin almacenada en bases de datos relacionales.
XPath 1.0 (http://www.w3.org/TR/xpath) es un estndar de la W3C, es una parte
integral de XSLT y puede ser utilizado con DOM para poder seleccionar conjuntos de
nodos. Para el tiempo en que se escribi este artculo se encuentra en Working Draft
(borrador) la versin 2.0 (http://www.w3.org/TR/xpath20) y comparte el mismo modelo
de datos con XQuery 1.0. Este artculo est basado en l y puede cambiar para cuando
se publique la versin final. El sistema de tipos de datos est basado en Xml Schema.
Posee una nutrida librera de funciones y operadores para poder ser utilizados en la
evaluacin de las expresiones.
2. Expresiones
El bloque bsico de construccin del lenguaje son las expresiones, que son construidas a
travs de palabras claves, smbolos y operadores. XPath es un lenguaje que distingue
entre maysculas y minsculas de la misma forma que XML. Las expresiones pueden
retornar valores escalares: que pueden ser booleanos, numricos o cadenas (en XPath
2.0 pueden ser de cualquier tipo definido en el Xml Schema), o un conjunto de nodos
(node-set)
3. Contextos
El contexto de una expresin es toda aquella informacin que puede incidir en el
resultado de la evaluacin de la misma. Se divide en esttico y dinmico. El contexto
esttico esta conformado por toda la informacin disponible en el anlisis esttico, es
decir, antes de la ejecucin de la expresin; como por ejemplo las variables que tienen
alcance dentro de la misma y que pueden ser utilizadas por la misma.
El contexto dinmico est compuesto por toda la informacin disponible cuando se est
evaluando la expresin, por ejemplo, el tem que est siendo evaluado actualmente
(podra compararse con el concepto de directorio actual en las expresiones para definir
la ruta relativa de un archivo), los valores actuales de las variables, la fecha y hora
actual, etc.
Puede hacerse una analoga entre el contexto esttico y dinmico con cualquier lenguaje
de programacin y la informacin que est disponible en tiempo de compilacin y en
tiempo de ejecucin.
Cuando se ejecuta una instruccin xsl:for-each de un XSLT el contexto est formado
por toda la informacin del nodo que se est procesando actualmente. De la misma
forma la instruccin xsl:template match="/" nos indica que nos encontramos en el
contexto del nodo raz del documento.
4. Expresiones primarias
Son las construcciones ms simples del lenguaje, incluyen literales, variables,
expresiones de contexto y llamados a funciones. Pueden utilizarse parntesis para forzar
la ejecucin de una serie de operadores en un orden especfico. Se puede hacer
referencia al contexto del tem actual con la expresin . como en el ejemplo 1

/Libros/Libro[count(./Autores/Autor)>1]
Ejemplo 1: Esta expresin devuelve todos los libros que poseen ms de un autor. El . puede
omitirse y la expresin entre parntesis puede resumirse a: Autores/Autor
4.1 Literales
Representan valores atmicos de tipo numrico o de cadena:
! "Hola mundo", representa un literal de cadena
! 100, representa el valor entero cien
! 100.13, representa un valor decimal

/Libros/Libro[Titulo=La Conspiracin]/Precio*1.3
Ejemplo 2: Esta expresin devuelve el precio del libro La Conspiracion y le aumenta un 30%.
En esta expresin la cadena La Conspiracion y el valor 1.3 son literales

Para representar valores de otros tipos deben utilizarse funciones:
! fn:true() o fn:false, representan valores del tipo xs:boolean
! xs:date("2005-06-20"), representa el 20 de Junio del ao 2005
4.2 Variables
El concepto de variable es anlogo al de cualquier lenguaje de programacin. En XPath
las variables estn precedidas por el smbolo $. Si existen dos variables con el mismo
nombre que tienen alcance en el contexto se opta por la ms cercana.

//Libro[Precio > $preciominimo]/Titulo
Ejemplo 3: Obtiene el ttulo de todos los libros cuyo precio supera el precio mnimo definido en
la variable $preciominimo.
4.3 Llamados a funciones
Este concepto tambin es anlogo al de las funciones definidas en cualquier lenguaje.
Las funciones tienen un nombre, seguido de la lista de parmetros entre parntesis.
Como se ve en el ejemplo 4 se realiza un llamado a la funcin count() que recibe como
parmetro un node-set y devuelve la cantidad de nodos del mismo.

count(/Libros/Libro)
Ejemplo 4: Esta expresin devuelve la cantidad de libros
/Libros/Libro/string-length(Titulo)
Ejemplo 5: Retorna la cantidad de caracteres del titulo de cada libro
/Libros/Libro/round(number(Precio/text()))
Ejemplo 6: Devuelve el precio redondeado a entero de cada libro
5. Operadores
XPath provee operadores aritmticos para las principales operaciones matemticas
como suma, resta, multiplicacin, divisin y mdulo. Tambin provee operadores
lgicos como conjuncin (and), disyuncin (or) y una funcin (fn:not) para realizar la
negacin. En la tabla 1 se enumeran todos los operadores.

Operadores Aritmticos
Smbolo Operacin
+ suma
- resta
div divisin
idiv divisin entera
mod mdulo
* multiplicacin
Operadores Lgicos
and conjuncin lgica y
or disyuncin lgico o
not negacin lgica (en realidad no es un operador sino
una funcin unaria fn:not()

Tabla 1.
/Libros/Libro[1]/Precio + /Libros/Libro[2]/Precio
Ejemplo 7:Obtiene la suma del precios del primer y segundo libro
/Libros/Libro[1]/Precio * $preciodolar
Ejemplo 8: Convierte el precio del primer libro que se encuentra en pesos a dlares
/Libros/Libro[Precio/text() > 66 and
Precio/@moneda='dolares']/Titulo
Ejemplo 9 :Devuelve el ttulo de los libros cuyo precio es mayor de U$S 66
6. Comparaciones
Las comparaciones en XPath se realizan con los smbolos =, !=, <, <=, >, >=. Estos
operadores de comparacin son de propsito general, es decir que pueden utilizarse con
cualquier tipo de datos, pero tienen equivalentes que sirven solo para comparar valores
simples: eq, ne, lt, le, gt, ge. La diferencia radica en que si los operandos no son
comparables (como en el caso de comparar un nodo con un nmero) y utilizamos
comparadores de valores como el eq se produce un error. Por otro lado, los
comparadores generales siempre devuelven verdadero o falso, nunca un error. Si en el
ejemplo 11 se utilizara el operador gt en vez de >, la expresin se evaluara con error
debido a que no se puede comparar el nodo Publicacin con un valor numrico.
Existen otros operadores de comparacin especiales para utilizar con nodos. El operador
is devuelve verdadero en el caso que dos expresiones devuelvan exactamente el mismo
nodo. Los operadores << y >> sirven para comparar el orden de los nodos en el
documento. El primero retorna verdadero si un nodo ocurre antes que otro en el orden y
el segundo devuelve verdadero si ocurre despus.

/Libros/Libro[position() = 2 ] is /Libros/Libro[2]
Ejemplo 10: Esta expresin devuelve verdadero ya que las dos subexpresiones separadas por
el signo = son equivalentes (es decir que referencian al mismo nodo)
/Libros/Libro[Publicacion > 2003]/Titulo
Ejemplo 11: Esta expresin retorna los libros que fueron publicados despus del ao 2003.
TUTORIAL DE XPATH 2.0 - Parte 2

7. Expresiones de ruta (Path)
Una expresin de ruta (path expression) sirve para localizar nodos dentro de la
estructura jerrquica propia de Xml. Cada expresin de ruta consta de varios pasos, cada
cual se separa por un smbolo / o //. El primero indica que el siguiente paso se
encuentra adyacente en la jerarqua de nodos, es decir que referencia a un hijo, y el
segundo puede localizar cualquier nodo que sea descendiente sin importar el nivel (es
una abreviatura de: descendant-or-self::node()).
Las rutas pueden ser absolutas o relativas. Si comienzan con el smbolo / son
absolutas y hacen referencia al nodo raz. En caso contrario hacen referencia al nodo
actual.

Sintaxis
ruta paso1/paso2/paso3//
7.1 Pasos
Cada paso en una ruta puede tener un eje, un filtro y cero o ms predicados y se evala
con respecto al conjunto de nodos producidos por el paso anterior.

Sintaxis
paso eje::filtro[predicado1][predicado2][]


Imagen 1: Expresin que devuelve los ttulos de los libros que se encuentran despus de El
Zorro
7.2 Ejes
El eje de un paso especifica la direccin que la que se va a evaluar, es decir si nos
vamos a mover hacia arriba en la jerarqua o hacia abajo, si se va a incluir el nodo actual
o no, etc. En la tabla 2 se muestran todos los ejes posibles.

Ejes
Direccin
Nombre Alcance
child Hijos del nodo actual
descendant Todos los descendientes del
nodo actual, sin importar el
grado, es decir que incluye los
nodos hijos de los hijos, etc.
attribute Incluye solamente a los
atributos
self Nodo actual
descendant-or-self Descendientes del nodo o el
nodo mismo
following-sibling Nodos que son hijos del nodo
padre y siguientes en orden del
actual
following Todos los nodos descendientes
del raz que se encuentran
despus de la posicin del
nodo actual y no son
descendientes del mismo
Hacia
adelante
namespace Solo existe por compatibilidad
para XPath 1.0 y contiene los
nodos de namespace del nodo
parent Padre del nodo
ancestor Todos los ancestros del nodo,
el padre, el padre del padre,
etc.
preceding-sibling Nodos que son hijos del nodo
padre y que se encuentran
anteriores al nodo actual
preceding Todos los nodos descendientes
del raz que se encuentran
antes de la posicin del nodo
actual y no son ancestros del
mismo
Hacia atrs
ancestor-or-self Ancestros del nodo o el nodo
mismo
Tabla 2.
7.3 Filtros (Node test)
Los filtros son utilizados para incluir o excluir nodos dentro de un eje, ya sea por
nombre o por tipo. El resultado son todos los nodos que cumplen con el filtro
especificado. En el caso de filtros por nombre se utiliza un QName. En la tabla 3 se
muestran algunos tipos de filtros.


Sintaxis
QName prefijo:nombrelocal


Filtros
Nombre Filtra
node() Todos los nodos
text() Todos los nodos del tipo text
comment() Todos los nodos del tipo
comment
element() Todos los elementos (nodos del
tipo element)
element(Libro) Todos los elementos de nombre
Libro
attribute() Todos los atributos
attribute(ISBN) Todos los atributos de nombre
ISBN
processing-
instruction
Todos los nodos del tipo
processing-instruction
QName Todos los nodos con ese nombre
* Todos los nodos excepto los del
tipo text, comment, y
processing-instruction
Tabla 3.

preceding::Libro
Ejemplo 12: Expresin que devuelve todos los nodos que son hijos del raz, no son hijos del
nodo actual, preceden en orden al nodo actual y se llaman Libro

7.4 Predicados
Los predicados son expresiones que permiten filtrar un conjunto de nodos utilizando un
criterio determinado. Filtran los nodos que se obtienen como resultado de la expresin
de ruta (path expression) que se ejecut hasta el momento, dejando solo aquellos para
los cuales se cumple el criterio. Los predicados se escriben entre corchetes. Si el
predicado consta de una expresin que se evala como entero entonces como resultado
se obtiene el nodo que se encuentra en esa posicin (es anlogo a los ndices de un
Array, con la diferencia de que los ndices comienzan en 1).

Libros/Libro[1]/Titulo
Ejemplo 13: Obtiene el ttulo del primer libro
Libros/Libro[count(../*)]/Titulo
Ejemplo 14: Obtiene el ttulo del ltimo elemento. Ntese que count(../*) no es un literal como
la expresin del ejemplo 13, sino una expresin que tiene por resultado un entero, en este caso
la cantidad de Libros
Libros/Libro/following::Libro[3]/Titulo
Ejemplo 15: Obtiene los ttulos de los libros que se encuentran despus del tercero

En cualquier otro caso (es decir cuando el resultado de la expresin del predicado no es
un entero) el resultado de aplicar el predicado es el conjunto de nodos para los cuales la
expresin resulta verdadera.

Libros/Libro[Autores/Autor/Nombre='Isabel']/Titulo
Ejemplo 16: Ttulo de los libros escritos por un autor de nombre Isabel

Libros/Libro[count(Autores/Autor)=1][Publicacion>2004
]
Ejemplo 17: Expresin que obtiene los libros que fueron escritos por un solo autor y fueron
publicados despus del 2004

7.5 Notacin abreviada
Existen formas abreviadas para escribir algunas expresiones de forma ms reducida. Por
ejemplo, en vez de utilizar el eje attribute se puede utilizar el smbolo @ como en el
ejemplo 18. En la tabla 4 podemos observar una lista de todas la abreviaturas.

Libros/Libro/attribute::ISBN
Libros/Libro/@ISBN
Ejemplo 18: Cualquiera de las anteriores expresiones tienen por resultado un listado de todos
los ISBN de los libros.

Abreviaturas
Forma normal Forma abreviada
child:: ninguna, siempre que se omita
el eje se sobreentiende que se
referencia a los hijos del nodo
actual
attribute:: @
self:node() .
parent::node() ..
/descendant-or-
self::node()
//
[position() =
numero]
[numero]
Tabla 4.

También podría gustarte