XPath
XPath
Diego Berrueta
[email protected]
Diego Berrueta
1
Contenido
Contenido
▶ Introducción
▶ Expresiones, rutas, ejes y pasos
▶ Funciones
▶ Ejercicios
Diego Berrueta
2
Introducción a XPath
Introducción a XPath
▶ Recomendación del W3C, desarrollada en
paralelo con XSLT
⇨Se usa también en XPointer y XLink
▶ Objetivo: seleccionar fragmentos de un
documento XML
▶ Objetivo complementario: definir patrones
para las plantillas
▶ Sintaxis no-XML
▶ Opera sobre una estructura abstracta (árbol),
no sobre la sintaxis
Diego Berrueta
3
Parecidos razonables
Parecidos razonables
▶ Rutas de directorios
▶ DOM
▶ XML Information Set (Infoset)
▶ Expresiones regulares
Diego Berrueta
4
Modelo de datos (I)
Modelo de datos (I)
▶ XPath trabaja con el XML modelado como un
árbol
▶ Los nodos del árbol pueden ser:
⇨Nodo raíz
⇨Nodo elemento
⇨Nodo texto
⇨Nodo atributo
⇨Nodo instrucción de procesamiento
⇨Nodo comentario
Diego Berrueta
5
Modelo de datos (II)
Modelo de datos (II)
▶ Existen dos recorridos del árbol:
⇨En el orden del documento (document-order)
⇨En el orden inverso (reverse-order)
▶ Valor-cadena de distintos nodos:
⇨Elementos: concatenación de todos los nodos de
texto descendientes
⇨Atributos: valor normalizado
⇨Texto: valor literal
Diego Berrueta
6
Cuestiones sintácticas
Cuestiones sintácticas
▶ Las expresiones XPath suelen ir dentro de
atributos XML (p.e.: select, match). Por tanto:
⇨Se aplican las normas de codificación de
cadenas de texto (“<” es “<”)
⇨Se pueden alternar comillas simples y dobles, o
codificarlas (" y ')
▶ Se usan muchas comodidades sintácticas
para abreviar las expresiones
Diego Berrueta
7
Funcionamiento general
Funcionamiento general
▶ El componente básico es la expresión
▶ Una expresión se evalúa respecto a un
contexto...
▶ ... para devolver un objeto, cuyo tipo puede
ser:
⇨Node-set (conjunto no ordenado de nodos, sin
duplicados)
⇨Booleano (true() / false())
⇨Número
⇨Cadena de texto
Diego Berrueta
8
Contexto de evaluación
Contexto de evaluación
▶ Un nodo de contexto
▶ La posición en el contexto (entero)
▶ El tamaño del contexto (entero)
Inmutables:
▶ Ligaduras de variables (no hay asignación)
▶ Biblioteca de funciones
▶ Declaraciones de espacios de nombres
Diego Berrueta
9
Expresiones
Expresiones
▶ Unión de dos node-sets: '|'
▶ Referencia a una variable ($variable)
▶ Valor literal (cadena o número)
▶ Llamada a una función u operador
▶ Ruta de localización
Diego Berrueta
10
Rutas de localización
Rutas de localización
▶ Las rutas de localización son las
expresiones más importantes
▶ Una ruta se compone de varios pasos de
localización
⇨Los pasos se separan por '/': paso1 / paso2 ...
▶ Una ruta puede ser:
⇨Relativa: se evalúa desde el nodo de contexto
⇨Absoluta (comienza por '/'): se evalúa desde el
nodo raíz
Diego Berrueta
11
Evaluación de una ruta
Evaluación de una ruta
▶ Se evalúa de izquierda a derecha
▶ El paso más a la izquierda se evalúa primero
respecto al contexto actual
▶ Se genera un nuevo resultado (habitualmente
un node-set)
▶ Para cada nodo del node-set, se evalúa
recursivamente el resto de la ruta,
modificando el contexto, y se concatenan los
resultados
Diego Berrueta
12
Pasos de localización
Pasos de localización
▶ Cada paso se compone de:
⇨Un eje
⇨Una prueba de nodo
⇨Opcionalmente, varios predicados
▶ Sintaxis:
eje :: prueba_nodo [pred1] [pred2] ...
Diego Berrueta
13
Evaluación de un paso
Evaluación de un paso
▶ Se construye un node-set con todos los nodos
que están relacionados con el nodo de
contexto en el eje indicado
▶ Se refina el node-set, descartando todos los
que no tengan el tipo o nombre indicado
▶ Se refina de nuevo el node-set,
seleccionando sólo los que verifiquen los
predicados
Diego Berrueta
14
Ejes (I)
Ejes (I)
▶ child:: Hijos directos
▶ parent:: Padre
(pero no atributos)
directo (si existe)
▶ descendant::
Descendientes
▶ ancestor::
Antecesores
▶ following-sibling::
▶ preceding-sibling::
Hermanos
posteriores
▶ following::
Posteriores
(excluyendo
descendientes)
Hermanos
precedentes
▶ preceding::
Precedentes
(excluyendo
antecesores)
Diego Berrueta
15
Ejes (II)
Ejes (II)
▶ self:: El nodo de contexto
▶ ancestor-or-self::
▶ descendant-or-self::
Ejes de tipo especial (no elementos):
▶ attribute:: Atributos del nodo de contexto
▶ namespace:: Espacios de nombres del nodo
de contexto
Diego Berrueta
16
Abreviaturas de ejes
Abreviaturas de ejes
▶ child:: es el eje por omisión
▶ attribute:: se abrevia '@'
▶ '.' equivale a “self::node()”
▶ '..' equivale a “parent::node()”
▶ '//' equivale a “/descendant-or-self::node()/”
Diego Berrueta
17
Pruebas de nodo
Pruebas de nodo
▶ Nombre cualificado: se verifica para los
nodos que tienen ese nombre
▶ '*': se verifica para todos los nodos del tipo
del eje (elementos, atributos, NS)
▶ node(): se verifica para cualquier tipo de
nodo [por tanto, * ⊆ node()]
▶ text(): se verifica para los nodos de tipo
texto
▶ comment() y processing-instruction(): se
verifica para los nodos de esos tipos
Diego Berrueta
18
Predicados
Predicados
▶ Actúan como filtros
▶ Un predicado puede ser:
⇨Un número: sólo se verifica si coincide con la
posición en el contexto. Atención: la numeración
comienza en 1, no en 0 (Java, C#)
⇨Una expresión booleana o convertible a
booleana (función boolean())
▶ El orden es significativo
Diego Berrueta
19
Funciones
Funciones
▶ Conversión de tipos:
⇨string(), number() y boolean()
▶ Operadores booleanos:
⇨and, or, not() [en realidad, not() es una función]
▶ Operadores aritméticos:
⇨+, -, *, div, mod [un espacio debe preceder a '-']
▶ Operadores de comparación:
⇨=, !=, <, >, <=, >= [igualdad con =, no ==]
▶ Funciones de biblioteca
Diego Berrueta
20
Funciones de conversión de
Funciones de conversión de
tipos (I)
tipos (I)
▶ string()
▶ number()
▶ boolean()
▶ Si el argumento de una función no es del tipo
esperado, se realiza una conversión implícita
usando una de estas tres funciones
⇨Observación: no hay conversión a node-sets
Diego Berrueta
21
Funciones de conversión de
Funciones de conversión de
tipos (II)
tipos (II)
▶ string(): convierte a cadena de texto
⇨Si es un número, se devuelve su representación
como cadena de texto (es mejor utilizar la
función format-number)
⇨Si es un booleano, se devuelve “true” o “false”
⇨Si es un node-set, se aplica al primer nodo
⇨Si es un nodo, se devuelve el valor-cadena
Diego Berrueta
22
Funciones de conversión de
Funciones de conversión de
tipos (III)
tipos (III)
▶ number(): convierte a un número flotante
⇨Si es una cadena, trata de parsearla
⇨Si es un booleano, true() es 1 y false() es 0
⇨Si es un node-set, se convierte primero a cadena
mediante string()
Diego Berrueta
23
Funciones de conversión de
Funciones de conversión de
tipos (IV)
tipos (IV)
▶ boolean(): convierte a un booleano
⇨Si es un número, es true() si distinto de cero
⇨Si es un node-set, es true() si contiene algún
elemento (muy útil en predicados)
⇨Si es una cadena, es true() si no es la cadena
vacía
Diego Berrueta
24
Funciones de biblioteca (I)
Funciones de biblioteca (I)
▶ Matemáticas
⇨sum()
⇨floor()
⇨ceiling()
⇨round()
Diego Berrueta
25
Funciones de biblioteca (II)
Funciones de biblioteca (II)
▶ Manipulación de cadenas:
⇨concat()
⇨substring()
⇨substring-before(), substring-after()
⇨translate()
⇨normalize-space()
⇨string-length() [resultado: entero]
▶ Predicados sobre cadenas:
⇨contains()
⇨starts-with() [pero no hay ends-with()]
Diego Berrueta
26
Funciones de biblioteca (III)
Funciones de biblioteca (III)
▶ Relativas al node-set o el contexto:
⇨position()
⇨last()
⇨count(node-set)
⇨id() [devuelve un node-set]
▶ Propiedades de los nodos:
⇨name()
⇨local-name()
⇨namespace-uri()
⇨lang()
Diego Berrueta
27
Carga de documentos
Carga de documentos
externos
externos
▶ document() permite cargar un documento
XML en tiempo de ejecución
▶ Esto permite extraer y combinar información
de múltiples ficheros
▶ Advertencia: suele presentar problemas de
rendimiento
Diego Berrueta
28
XPath como lenguaje de
XPath como lenguaje de
patrones
patrones
▶ XSLT reaprovecha XPath como lenguaje para
definir los patrones de las plantillas
▶ No todas las expresiones XPath pueden ser
patrones:
⇨Debe devolver un node-set
⇨Sólo valen los ejes child:: y attribute:: (y '//')
▶ Un nodo “encaja” con el patrón si pertenece
al node-set resultante de evaluar la expresión
con respecto a algún contexto formado por él
mismo o por sus antecesores
Diego Berrueta
29
EJERCICIOS
Diego Berrueta
30
Fichero RSS (ej: Barrapunto)
Fichero RSS (ej: Barrapunto)
▶ Obtener el título del canal
▶ Obtener el título de la primera noticia
▶ Contar el número de noticias
▶ Contar cuántas noticias han sido editadas por
“Yonderboy”
▶ Contar cuántas noticias tienen más de 50
comentarios
▶ Sumar los comentarios de todas las noticias
▶ Contar cuántas noticias fueron editadas el
mismo día que la más reciente
Diego Berrueta
31
Población provincias (I)
Población provincias (I)
▶ Contar cuántas provincias hay
▶ Obtener la población de la provincia más
poblada (están ordenadas de mayor a menor)
▶ Contar cuántas provincias superan el millón
de habitantes
▶ Sumar la población de todas las provincias
▶ Sumar la población de las provincias de
menos de un millón de habitantes
▶ Sumar la población de las 5 provincias más
pobladas
Diego Berrueta
32
Población provincias (II)
Población provincias (II)
▶ Sumar la población de las provincias que
ocupen una posición par
▶ Provincias que comienzan por 'A'
▶ Provincias que contienen la letra 'a'
(minúscula)
▶ Provincias que contienen la letra 'a'
(minúscula o mayúscula)
▶ Provincias que contienen alguna de estas
letras: 'b, d, g' (sin usar OR)
Diego Berrueta
33
Población pr
Comentarios de: XPath (0)
No hay comentarios