XPATH
XPATH
Aunque las hojas de estilo CSS se pueden aplicar a los documentos XML, las hojas de estilo tienen muchas
limitaciones ya que se crearon para complementar al HTML, es decir, para ver pginas web en pantallas de
ordenador. De la misma manera que el XML es una generalizacin del HTML, el W3C cre una generalizacin
de las hojas de estilo CSS a la que se denomin XSL (eXtensible Stylesheet Languaje), es decir, Lenguaje de hojas
de estilo extensible.
El W3C ha desarrollado tres lenguajes:
XSLT (XSL Transformation, es decir, Transformaciones XSL): un lenguaje para transformar documentos
XML.
XSL-FO (XSL Formatting Objects, es decir, Objetos de formato XSL): un lenguaje para especificar el formato
de un documento XML y posteriormente convertirlo a PDF o PostScript.
Cuando dos nodos estn unidos por un arco con direccin, el nodo padre es el
nodo del que parte el arco y el nodo hijo es el nodo al que llega el arco.
Un rbol es un grafo en el que cualquier pareja de
vrtices estn conectada por un nico camino (es decir, que no hay ciclos). Un rbol dirigido es un rbol en
el que las aristas tienen direccin y todos los nodos menos uno tienen un nico padre.
Tipos de nodos
Un documento XML puede representarse como un rbol dirigido, considerando por ejemplo los elementos como
nodos y que un elemento es padre de los elementos que contiene. Pero en XPath no slo los elementos son nodos,
en realidad hay siete tipos de nodos:
Raz
Elemento
Atributo
Texto
Comentario
Instruccin de procesamiento
Espacio de nombres
Las expresiones XPath se pueden dividir en pasos de bsqueda. Cada paso de bsqueda se puede a su vez
dividir en tres partes:
seleccin de nodos: de los nodos seleccionados por el eje y predicado, selecciona los elementos, el texto que
contienen o ambos.
Sintaxis abreviada
Veamos unos ejemplos de expresiones XPath de sintaxis abreviada y el resultado de su evaluacin en el
documento de ejemplo anterior:
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<libro>
<titulo>La vida est en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion ao="1973"/>
</libro>
<libro>
<titulo>Pantalen y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1973"/>
</libro>
<libro>
<titulo>Conversacin en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1969"/>
</libro>
</biblioteca>
/: si est al principio de la expresin, indica el nodo raz, si no, indica "hijo". Debe ir seguida del nombre de
un elemento.
/biblioteca/libro/autor/@fechaNacimiento fechaNacimiento="28/03/1936"
fechaNacimiento="28/03/1936"
/biblioteca/libro/@fechaNacimiento No devuelve nada porque <libro> no tiene el
atributo fechaNacimiento.
Nota: En XPath 1.0 no se puede seleccionar nicamente el valor del atributo, sino que se obtienen
respuestas del tipo nombreDelAtributo=ValorDelAtributo
//@ao ao="1973"
ao="1973"
ao="1969"
/..: indica el elemento padre.
[nmero]: si hay varios resultados selecciona uno de ellos por nmero de orden; last() selecciona el ltimo
de ellos
//libro[1] <libro>
<titulo>La vida est en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion ao="1973"/>
</libro>
//libro[last()] <libro>
<titulo>Conversacin en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1969"/>
</libro>
//libro[last()-1] <libro>
<titulo>Pantalen y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1973"/>
</libro>
Los predicados permiten definir condiciones sobre los valores de los atributos. En las condiciones se
pueden utilizar los operadores siguientes:
Las comparaciones se pueden hacer entre valores de nodos y atributos o con cadenas de texto o numricas.
En el caso de las cadenas de texto deben estar rodeadeas por comillas simples o dobles. En el caso de las
cadenas numricas, las comillas son optativas.
o La condicin puede utilizar el valor de un atributo (utilizando @) o el texto que contiene el elemento.
En los ejemplos siguientes se obtienen respectivamente los elementos <fechaPublicacion> cuyo
atributo ao es posterior/mayor a 1970 y los elementos <libro> cuyo subelemento <autor> tiene como
contenido "Mario Vargas LLosa":
o Para hacer referencia al propio valor del elemento seleccionado se utiliza el punto (.).
//@ao[.>1970] ao="1973"
ao="1973"
/biblioteca/* <libro>
<titulo>La vida est en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion ao="1973"/>
</libro>
<libro>
<titulo>Pantalen y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1973"/>
</libro>
<libro>
<titulo>Conversacin en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1969"/>
</libro>
//autor/* No devuelve nada porque <autor> slo contiene texto.
/biblioteca//* <libro>
<titulo>La vida est en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion ao="1973"/>
</libro>
<titulo>La vida est en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion ao="1973"/>
<libro>
<titulo>Pantalen y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1973"/>
</libro>
<titulo>Pantalen y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1973"/>
<libro>
<titulo>Conversacin en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1969"/>
</libro>
<titulo>Conversacin en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion ao="1969"/>
//@* ao="1973"
fechaNacimiento="28/03/1936"
ao="1973"
fechaNacimiento="28/03/1936"
ao="1969"
//libro/@* No devuelve nada porque <libro> no tiene atributos.
//autor/@* fechaNacimiento="28/03/1936"
fechaNacimiento="28/03/1936"
Nota: En XPath 1.0 no se puede seleccionar nicamente el valor del atributo, sino que se obtienen
respuestas del tipo nombreDelAtributo=ValorDelAtributo
en el segundo paso (/../titulo), se seleccionan primero los elementos padre (/..) de los <fechaPublicacion>
seleccionados en el primer paso de bsqueda (es decir, elementos <libro>) y a continuacin sus
subelementos <titulo>.
En los ejemplos siguientes se obtienen los libros escritos por Mario Vargas Llosa de dos formas distintas:
o mediante un slo paso de bsqueda. Se seleccionan los elementos <libro> cuyo subelemento <autor>
tiene como contenido la cadena "Mario Vargas Llosa".
o mediante dos pasos de bsqueda. En el primer paso se seleccionan los elementos <autor> cuyo
contenido es la cadena "Mario Vargas Llosa". En el segundo paso de bsqueda se seleccionan los
elementos padre (es decir, los elementos <libro>).
En los ejemplos siguientes se obtiene el autor que ha publicado libros en 1969 de varias formas distintas:
obtener primero el ao en que se public la novela "La vida est en otra parte":
Otro ejemplo de expresin anidada sera obtener los ttulos de los libros del mismo autor que la novela
"Pantalen y las visitadoras". Como en el ejemplo anterior, la respuesta puede obtenerse en dos pasos:
y obtener despus los ttulos de los libros escritos por Mario Vargas LLosa:
Sintaxis abreviada
[nmero]: si hay varios resultados selecciona uno de ellos por nmero de orden; last() selecciona el ltimo
de ellos.
[condicion]: selecciona los nodos que cumplen la condicin. La condicin puede utilizar el valor de un
atributo (utilizando @) o el texto que contiene el elemento.
Se pueden escribir varios predicados seguidos, teniendo en cuenta que cada uno restringe los resultados
del anterior, como si estuvieran encadenados por la operacin lgica and.