XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf ·...
Transcript of XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf ·...
Diego Berrueta 2
ContenidoContenido
▶ Introducción▶Expresiones, rutas, ejes y pasos▶Funciones
▶Ejercicios
Diego Berrueta 3
Introducción a XPathIntroducció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 4
Parecidos razonablesParecidos razonables
▶Rutas de directorios▶DOM▶XML Information Set (Infoset)▶Expresiones regulares
Diego Berrueta 5
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 6
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 7
Cuestiones sintácticasCuestiones 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 8
Funcionamiento generalFuncionamiento 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 9
Contexto de evaluaciónContexto 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 10
ExpresionesExpresiones
▶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 11
Rutas de localizaciónRutas 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 12
Evaluación de una rutaEvaluació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 13
Pasos de localizaciónPasos 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 14
Evaluación de un pasoEvaluació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 15
Ejes (I)Ejes (I)
▶child:: Hijos directos (pero no atributos)
▶descendant:: Descendientes
▶ following-sibling:: Hermanos posteriores
▶ following:: Posteriores (excluyendo descendientes)
▶parent:: Padre directo (si existe)
▶ancestor:: Antecesores
▶preceding-sibling:: Hermanos precedentes
▶preceding:: Precedentes (excluyendo antecesores)
Diego Berrueta 16
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 17
Abreviaturas de ejesAbreviaturas 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 18
Pruebas de nodoPruebas 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 19
PredicadosPredicados
▶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 20
FuncionesFunciones
▶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 21
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 22
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 23
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 24
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 25
Funciones de biblioteca (I)Funciones de biblioteca (I)
▶Matemáticas⇨sum()⇨floor()⇨ceiling()⇨round()
Diego Berrueta 26
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 27
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 28
Carga de documentos Carga de documentos externosexternos
▶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 29
XPath como lenguaje de XPath como lenguaje de patronespatrones
▶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 30
EJERCICIOS
Diego Berrueta 31
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 32
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 33
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 34
Población provincias (III)Población provincias (III)
▶Provincias que terminan en 's'▶Provincias que tienen al menos una 'a' y
además tienen al menos una 'e' antes de la primera 'a'
▶Provincias que tienen una 'e' entre sus primeras 4 letras
▶Provincias que van justo después de otra que contiene la letra 'i'
Diego Berrueta 35
Superficie comunidades (I)Superficie comunidades (I)
▶Superficie de la comunidad más grande⇨Están ordenadas de mayor a menor
▶Calcular la superficie de España⇨PRIMER INTENTO: eliminar las unidades⇨SEGUNDO INTENTO: usar otro fichero
▶Sumar la superficie de las comunidades uniprovinciales
▶Comunidades más grandes que Asturias▶Comunidades uniprovinciales con el mismo
nombre que la provincia
Diego Berrueta 36
Superficie comunidades (II)Superficie comunidades (II)
▶Comunidades que tienen un número par de provincias
▶Comunidades que tienen más de una palabra en el nombre
▶La segunda comunidad (por población) que tiene más de una palabra en el nombre⇨Atención al orden de los predicados
▶Comunidades cuyas provincias tienen todas una 'a'⇨Sugerencia: probar primero con alguna
Diego Berrueta 37
Superficie comunidades (III)Superficie comunidades (III)
▶Provincias que son primeras o últimas en sus comunidades⇨Lo mismo, pero sin usar position() ni last()
▶Lo mismo, pero sólo en comunidades con al menos tres provincias
▶Comunidades cuya superficie media por provincia sea al menos de 10.000 km2
Diego Berrueta 38
Otros ejerciciosOtros ejercicios
▶Redondear un número real con una cantidad fija de decimales
▶Expresión absoluta que selecciona todos los nodos
▶Expresión relativa que selecciona todos los nodos
Diego Berrueta 39
Limitaciones de XPathLimitaciones de XPath
▶Xpath es demasiado pobre para expresar algunas consultas:⇨Join⇨Map⇨Ordenación de resultados⇨...
▶Sin embargo, la combinación de XPath + XSLT es mucho más potente
▶Algunos procesadores de XPath + XSLT permiten acoplar extensiones
Diego Berrueta 40
ReferenciasReferencias
▶XML Path Language (XPath) [W3C Recommendation]
▶Página de XPath en la Wikipedia▶XSLT Cookbook [Sal Mangano, O'Reilly]
Diego Berrueta 41
F I N