introducción: xpath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica...

45
Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations [XSLT] y XPointer [XPointer]; y es a su vez la base sobre la que se han especificado nuevas herramientas para el tratamiento de documentos XML. Herramientas tales como XLink y XQL, que están cambiando el modo en que actualmente concebimos la navegación por la Web. ●Así, XPath sirve para indicar a una hoja de estilo como procesar el contenido de una página XML, pero también para cargar en un navegador determinadas zonas de una página XML, en vez de toda la página. El propósito primario de XPath es direccionar partes de un documento XML, seleccionar y hacer referencia a texto, elementos, atributos y cualquier otra información contenida dentro de un documento XML y localizar nodos que cumplen con XPath Versión: 1.0

Upload: novio-navarrete

Post on 20-Feb-2015

9 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Introducción:

● XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations [XSLT] y XPointer [XPointer]; y es a su vez la base sobre la que se han especificado nuevas herramientas para el tratamiento de documentos XML. Herramientas tales como XLink y XQL, que están cambiando el modo en que actualmente concebimos la navegación por la Web.

●Así, XPath sirve para indicar a una hoja de estilo como procesar el contenido de una página XML, pero también para cargar en un navegador determinadas zonas de una página XML, en vez de toda la página.

● El propósito primario de XPath es direccionar partes de un documento XML, seleccionar y hacer referencia a texto, elementos, atributos y cualquier otra información contenida dentro de un documento XML y localizar nodos que cumplen con determinado patrón.

XPath Versión: 1.0

Page 2: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

XPath Versión: 1.0

●Todo el procesamiento a realizar sobre un archivo XML está

basado en la posibilidad de direccionar o acceder a cada una de las partes que lo componen, de modo que podamos tratar cada uno de los elementos en forma diferenciada.

● El tratamiento de un documento XML comienza por la localización del mismo a lo largo del conjunto de documentos existentes. Para realizar esta localización de forma unívoca, se utilizan los URI (Unifom Resource Identifiers), de los cuales los URL (Unifom Resource Locators) son sin duda los más conocidos.

● Una vez localizado el documento XML, una forma de seleccionar información dentro de él es mediante el uso de XPath, que es la abreviación de XML Path Language.

Page 3: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

El modelo de datos de XPath Árbol de Nodos

● XPath opera sobre un documento XML considerándolo como un árbol. Este modelo es solamente conceptual y no impone ninguna implementación en particular.

Existen siete tipos de nodos: • nodos raíz • nodos elemento • nodos texto • nodos atributo • nodos espacio de nombres • nodos instrucción de procesamiento • nodos comentario

● Hay una ordenación, el nodo raíz será el primer nodo. Los nodos elemento se ordenan de acuerdo al orden de aparición de sus etiquetas en el documento XML. Los nodos atributo y los nodos espacio de nombres de un elemento aparecen antes que los hijos de dicho elemento. Los nodos espacio de nombres aparecen por definición antes que los nodos atributo.

Page 4: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

El modelo de datos de XPath

Árbol de Nodos

● Un documento XML es procesado por un analizador (o parser) construyendo un árbol de nodos. Este árbol comienza con un elemento raíz, que se expande a lo largo de los elementos que cuelgan de él y acaba en nodos hoja, que contienen solo texto, comentarios, Instrucciones de procesamiento o incluso que están vacíos y sólo tienen atributos

●A continuación se muestra un ejemplo de cómo se convierte en árbol un documento XML. En primer lugar se muestra el documento XML y a continuación el árbol que genera.

Page 5: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

<libro> <titulo>Dos por tres calles</titulo> <autor>Josefa Santos</autor> <capitulo num="1"> La primera calle <parrafo> Era una sombría noche del mes de agosto... </parrafo> <parrafo destacar="si"> Ella, inocente cual <enlace href="http://www.mariposa.es">mariposa</enlace> que surca el cielo en busca de libaciones... </parrafo> </capitulo> <capitulo num="2" public="si"> La segunda calle <parrafo>Era una oscura noche del mes de septiembre...</parrafo> <parrafo> Ella, inocente cual <enlace href="http://www.abejilla.es">abejilla</enlace> que surca el viento en busca del néctar de las flores... </parrafo> </capitulo>

Documento XML

Page 6: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

<apendice num="a" public="si"> La tercera calle <parrafo> Era una densa noche del mes de diciembre... </parrafo> <parrafo> Ella, cándida cual <enlace href="http://www.pajarillo.es">pajarillo</enlace> que surca el espacio en busca de bichejos para comer... </parrafo> </apendice></libro>

Page 7: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Árbol generado/|+---libro | +---titulo | | | +---(texto)Dos por tres calles | +---autor | | | +---(texto)Josefa Santos | +---capitulo [num=1] | | | +---(texto)La primera calle | | | +---parrafo | | | | | +---(texto)Era una sombría noche ... | +---parrafo | | | +---(texto)Ella, inocente cual mariposa... | +---capitulo [num=2] | +---(texto)La segunda calle | +---parrafo | | | +---(texto)Era una oscura noche ... +---parrafo | +---(texto)Ella, cual inocente abejilla...

Page 8: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Tipos de Nodos

Existen distintos tipos de nodos en un árbol generado a partir de un documento XML, a saber: raíz, elemento, atributo, texto, comentario e instrucción de procesamiento.

Nodo Raíz

Se identifica por /. No se debe confundir el nodo raíz con el elemento raíz del documento. Así, el documento XML de nuestro ejemplo tiene por elemento raíz a libro, éste es el primer nodo que cuelgua del nodo raíz del árbol, que es /

Nodo Elemento

Cualquier elemento de un documento XML se convierte en un nodo elemento dentro del árbol. El nodo padre de cualquier elemento es, a su vez, un elemento, excepto el elemento raíz, cuyo padre es el nodo raíz.

Page 9: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Nodo Elemento…

Los nodos elemento tienen a su vez hijos, que son: nodos elemento, nodos texto, nodos comentario y nodos de intrucciones de proceso.

● Los nodos elemento también tienen propiedades tales como su nombre, sus atributos e información sobre los "espacios de nombre" que tengan activos.

● Una propiedad interesante de los nodos elemento es que pueden tener identificadores únicos (para ello deben ir acompañados de un DTD que especifique que dicho atributo toma valores únicos), esto permite referenciar a dichos elementos de una forma mucho más directa.

Page 10: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Nodos texto

Por texto vamos a hacer referencia a todos los caracteres del documento marcados con alguna etiqueta. Un nodo texto no tiene hijos, es decir, los distintos caracteres que lo forman no se consideran hijos.

Nodos atributo

Como ya hemos indicado, los nodos atributo no son considerados hijos del nodo elemento que los contiene sino propiedades de dicho nodo elemento.

● Cada nodo atributo consta de un nombre y un valor (que es siempre un string) y un posible "espacio de nombres".

Nodos comentario y de instrucciones de proceso

En el árbol también se “generan” nodos para cada nodo con comentarios o con intrucciones de proceso.

Page 11: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Conceptos Básicos

ExpresionesUna "instrucción" en lenguaje XPath se denomina una expresión.

(XPath es un lenguaje declarativo por eso instrucción está entre comillas).

● Una expresión es la construcción sintáctica básica en XPath. Son evaluadas para producir un objeto, que tendrá uno de los siguientes cuatro tipos básicos:

• Conjunto de nodos (una colección desordenada de nodos

sin duplicados) • booleano (verdadero o falso) • número (un número en punto flotante) • cadena de caracteres

La sintaxis de una expresión de camino es similar a la usada para describir los directorios en Unix o Linux. Sin embargo, el significado de las expresiones es totalmente diferente.

Expresiones

Page 12: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Conceptos Básicos…

● La evaluación de expresiones se realiza respecto a un contexto, dado básicamente por el llamado nodo contextual.

● Para comprender mejor el concepto de contexto, pensemos en un árbol que contiene nodos. Al buscar desde la raíz del árbol todos los nodos con el nombre X se obtiene un conjunto de resultados, mientras que si lo hacemos desde una rama del árbol se obtiene un conjunto diferente de resultados. Por

tanto, el resultado de una expresión depende del contexto en el cual se ejecute.

Expresiones de camino (“Location Paths”)

Page 13: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

● Un tipo importante de expresión son las expresiones de camino de localización (“Location Path”).

● El resultado que entrega un camino de localización, es el conjunto de nodos seleccionados al evaluar dicho camino. Hay que considerar una expresión XPath como un “predicado”, que devuelve todo lo que encaja con dicho predicado

● El concepto de "nodo contexto" es imprescindible para comprender cómo se lleva a cabo la elección de los nodos que cumplen con el patrón indicado en la expresión. El nodo contexto cambia con cada /, que actúa como separador de los pasos de localización.

Expresiones de camino…

Page 14: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Nodo actual vs nodo contexto

Expresiones de camino…

• Nodo actual (current node)

–Es un nodo que está seleccionado cuando se va a evaluar una expresión XPath –Constituye el punto de partida al evaluar la expresión

• Nodo contexto (context node)

–Cada vez que se evalúa una sub-expresión se obtiene un nuevo conjunto de nodos (node-set) que es el nuevo contexto para evaluar la siguiente subexpresión. • Tamaño del contexto (context size)

–El número de nodos que se están evaluando en un momento dado en la expresión XPath

Page 15: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Nodo actual vs nodo contexto…

● En la mayor parte de los casos son la misma cosa. El nodo actual es sobre el que se está operando, normalmente ocurre que éste es también el nodo contexto, pero el nodo contexto tiene un significado especial dentro de las expresiones anidadas (van entre corchetes). En ellas el nodo contexto se refiere al nodo que está siendo testeado en busca de coincidencias (tested for a match). De ahí que el nodo contexto cambia dentro de las expresiones, pero no el nodo actual.

● A causa de esto es útil poder recuperar desde una sub- expresión el nodo original para el cual la expresión está

siendo evaluada. Para ello podemos usar la función current() cuya utilidad es dar acceso al nodo actual cuando este no es el

mismo que el nodo contexto.

● El nodo contexto se abrevia con un punto (.) o a veces directamente se omite

Expresiones de camino…

Page 16: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

●Hay dos tipos de caminos de localización: caminos de localización relativos y caminos de localización absolutos.

● Un camino de localización relativo consiste en una secuencia de uno o más pasos de localización separados por /. Los pasos en un camino de localización relativo se componen de izquierda a derecha. Una secuencia inicial de pasos se une al paso siguiente de la siguiente forma. La secuencia inicial de pasos selecciona un conjunto de nodos relativos a un nodo de contexto. Cada nodo de ese conjunto se usará como nodo de contexto para el siguiente paso. Los distintos conjuntos de nodos identificados por ese paso se unen. Por ejemplo, child::emple/child::nombre selecciona los elementos nombre hijos de los elementos emple hijos del nodo contextual, o, en otras palabras, los elementos nombre nietos que tengan padres emple.

● Un camino de localización absoluto consiste en / seguido opcionalmente por un camino de localización relativo. Una / por si misma selecciona el nodo raíz del documento. Si es seguida por un camino de localización relativo, entonces el camino de localización selecciona el conjunto de nodos que seleccionaría el camino de localización relativo con el nodo raíz del documento como nodo contextual.

Expresiones de camino…

Page 17: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

● Para explicar lo anterior, veamos cómo actuaría un motor de evaluación de expresiones XPath al leer la siguiente expresión aplicada al documento XML del ejemplo libro:

/libro/capitulo/parrafo

Expresiones de camino…

Page 18: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

evaluación de expresiones XPath …

/libro/capitulo/parrafo

● La primera / indica que debe seleccionar el nodo raíz, en el momento en que el evaluador de XPath localiza el nodo raíz, éste pasa a ser el nuevo nodo contexto de dicha expresión.

El analizador continua leyendo la expresión XPath y llega a parrafo, entonces deben seleccionarse TODOS los elementos parrafo que cuelgan del nuevo nodo contexto...¡¡pero NO hay un capítulo, sino 2 Bueno, no pasa nada, cada uno de los nodos de ese conjunto de nodos va a tener “su momento”, el evaluador de expresiones los va a recorrer uno por uno haciendo que, mientras evalúa un determinado nodo, ése sea el nodo contexto.

En otras palabras, para localizar todos los elementos parrafo, se procesa el primer elemento capitulo y de él se extraen todos los parrafos que contenga. A continuación se pasa al próximo elemento capitulo del cual se vuelven a extraer todos los parrafos que tenga... y así sucesivamente. El resultado final es un conjunto de nodos que encajan con el patrón buscado.

Expresiones de camino…

Page 19: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización

● Un paso de localización es cada paso de una ruta de localización (separados por /) y consiste en:

● Un eje de dirección (axis), que especifica la relación jerárquica entre los nodos seleccionados por el paso de localización y el nodo contextual.

● Una prueba de nodo (node test), que especifica el tipo de nodo y el nombre-expandido (algunos tipos de nodo tienen un nombre expandido, que es un par formado por una parte local y un URI de espacio de nombres).

● Cero o más predicados, para refinar aún más el conjunto de nodos seleccionado por el paso de localización.

• El eje a veces está implícito (no se pone). El predicado es opcional.

La sintaxis del paso de localización es: eje::node_test[predicado]

Por ejemplo, en child::nombre[position()=1] , child es el eje, nombre es la prueba de nodo y [position()=1] es un predicado.

Expresiones de camino…

Page 20: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización…

● El conjunto de nodos seleccionado por el paso de localización es el que resulta de generar un conjunto de nodos inicial a partir del eje y prueba de nodo, y a continuación filtrar dicho conjunto por cada uno de los predicados en forma sucesiva.

● El conjunto de nodos inicial se compone de los nodos que tengan la relación con el nodo contextual que se especifica en el eje, y tengan el tipo de nodo y nombre especificados por la prueba de nodo.

Por ejemplo, un paso de localización descendant::nombre selecciona los elementos nombre descendientes del nodo contextual, cada nodo en el conjunto de nodos inicial debe ser un descendiente del contexto y ser un elemento llamado nombre.

Expresiones de camino…

Page 21: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Los atributos son accedidos usando “@”

Las expresiones de camino son evaluadas de izquierda a derecha

Cada paso opera sobre el conjunto de instancias producido por el paso previo

Un predicado de selección puede seguir a cualquier paso de un camino, se expresa entre [ ]

Ejemplos: /banco/cuenta [balance > 400]

Retorna los elementos cuenta con balance mayor que 400

/banco/cuenta [balance]

retorna elementos cuenta que contengan un subelemento balance

/banco/cuenta [balance > 400]/@número_cuenta

Devuelve los números_de_cuenta de las cuentas que tengan balance > 400

Un paso del camino puede ir a padres, hermanos, ancestros y descendientes de los nodos generados en un paso previo, y no necesariamente a un hijo.

Page 22: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Pasos de localización: Ejes

Los ejes disponibles son:

ancestor, ancestor-or-self, attribute, child, descendant, descendant-or-self, following, following-sibling, namespace, parent, preceding, preceding-sibling, self

• El eje y la prueba de nodo se separan mediante el operador ::

• Dicho operador equivale a “que es un”, pero sus argumentos se leen de derecha a izquierda.

• child está implícito y casi nunca se pone. Para el nodo raíz, está implícito self (self denota al nodo de contexto)

• Ejemplo:

/emple/child::nombre/following-sibling::* Selecciona todos los nodos que son “hermanos después de” nombre (en

el orden del documento) que es hijo de emple

eje::pruebanodo[predicado]contexto

cq nodo

Page 23: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Pasos de localización: Ejes…

El eje child contiene los hijos del nodo contextual.

El eje descendant contiene los descendientes del nodo contextual; un descendiente es un hijo o el hijo de un hijo, etc; de modo que el eje descendant nunca contiene nodos atributo o espacio de nombres.

El eje parent contiene el  padre del nodo contextual, si lo hay.

El eje ancestor contiene los ancestros del nodo contextual; los ancestros del nodo contextual consisten en el  padre del nodo contextual y el padre del padre, etc; así, el eje ancestor siempre incluirá al nodo raíz, salvo que el nodo contextual sea el nodo raíz.

Page 24: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Pasos de localización: Ejes…

El eje  following-sibling contiene todos los siguientes hermanosdel nodo contextual; si el nodo contextual es un nodo atributo o un nodo espacio de nombres, el eje following-sibling está vacío.

El eje preceding-sibling contiene todos los hermanos precedentes del nodo contextual; si el nodo contextual es un nodo atributo o un nodo espacio de nombres, el eje preceding-sibling está vacío

El eje following contiene todos los nodos del mismo documento que el nodo contextual que están después de este según el orden del documento, excluyendo los descendientes y excluyendo nodos atributo y nodos espacio de nombres.

El eje preceding contiene todos los nodos del mismo documento que el nodo contextual que están antes de este según el orden del documento, excluyendo los ancestros y excluyendo nodos atributo y nodos espacio de nombres.

Page 25: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Pasos de localización: Ejes…

El eje attribute contiene los atributos del nodo contextual; el ejeestará vacío a no ser que el nodo contextual sea un elemento.

El eje namespace contiene los nodos espacio de nombres del nodocontextual; el eje estará vacío a no ser que el nodo contextual seaun elemento.

El eje self contiene simplemente el propionodo contextual.

El eje descendant-or-self contiene el nodo contextual y sus descendientes.

El eje ancestor-or-self contiene el nodo contextual ysus ancestros; así, el eje ancestor-or-self siempre incluirá el nodo raíz.

Page 26: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización: Ejes…

Ejemplos:

child::a selecciona los elementos hijo con nombre a del nodo contextochild::* selecciona todos los elementos hijo del nodo contexto child::text() selecciona todo el texto hijo del nodo contextochild::node() selecciona todo (elemento o texto) hijo del nodo contextoattribute::a selecciona el atributo con nombre a del nodo contextoattribute::* selecciona todos los atributos del nodo contexto descendant::a selecciona los elementos descendiente del nodo contexto de nombre a descendant-or-self::a selecciona los elementos descendiente con nombre a del nodo contexto y el propio nodo contexto si tiene nombre aancestor::a selecciona todos los ancestros con nombre a del nodo contextoancestor-or-self::a selecciona todos los ancestros con nombre a del nodo contexto y el propio nodo contexto si este tiene nombre aself::a selecciona el nodo contexto si este tiene nombre a, en caso contrario no selecciona nada

Expresiones de camino…

Page 27: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización: Ejes:… ejemplos

child::capítulo/descendant::a selecciona los descendientes con nombre a de los elementos hijo con nombre capítulo del nodo contexto

child::*/child::a selecciona todos los nietos con nombre a del nodo contexto / selecciona la raiz del documento

/descendant::a selecciona todos los elementos de nombre a en el mismo documento del nodo contexto

/descendant::a/child::b selecciona todos los elementos con nombre b que tienen un padre con nombre a en el mismo documento del nodo contexto

child::a[position()=1] selecciona el primer hijo con nombre a del nodo contexto

child::a[position()=last()] selecciona el último hijo con nombre a del nodo contexto

child::a[position()=last()-1] selecciona el penúltimo hijo con nombre a del nodo contexto

child::a[position()>1] selecciona todos los hijos con nombre a del nodo contexto excepto el primero

Expresiones de camino…

Page 28: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización: Ejes… ejemplos

following-sibling::capítulo[position()=1] selecciona el siguiente capítulo hermano del nodo contexto

preceding-sibling::capítulo[position()=1] selecciona el capítulo hermano anterior del nodo contexto

/descendant::figura[position()=12] selecciona el elemento 12 con nombre figura en el documento

child::a[attribute::tipo=“warning”] selecciona todos los hijos de nombre a del nodo contexto que tienen un atributo de nombre tipo y valor “warning”

child::a[attribute::tipo=“warning”][position()=5] selecciona el 5to hijo con nombre a del nodo contexto que tenga un atributo con nombre tipo y valor “warning”

child::capítulo[child::título] selecciona el capítulo hijo del nodo contexto que tenga uno o más hijos con nombre título

child::*[self::capítulo or self::apéndice] selecciona el capítulo y apéndice de los hijos del nodo contexto

Expresiones de camino…

Page 29: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización: Ejes…Sintaxis abreviada (Se usa más que la sintaxis no abreviada)

child:: se omite ej. child::name se reemplaza por name

attribute:: se abrevia @ ej. attribute::name se reemplaza por @name

Para seleccionar el atributo num que posean los elementos capitulo /libro/capitulo/@num

/descendant:: se abrevia // y se usa para saltar múltiples niveles de nodos (es un atajo a los descendientes) ejemplos: Para seleccionar todos los parrafo de un libro: /libro//parrafo

Para seleccionar todos los descendientes de parrafo que tienen un atributo href : //parrafo//*[@href]

Para seleccionar el valor del atributo href del caso anterior: //parrafo//*[@href]/@href

Para seleccionar todos los elementos descendientes de capitulo /libro/capítulo//*

Expresiones de camino…

Page 30: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Pasos de localización: Ejes…

Sintaxis abreviada

self::node() Se abrevia mediante un punto .

Es muy útil pues sirve para seleccionar el nodo contexto. Por ejemplo, supongamos que deseamos seleccionar todos los

elementos parrafo descendientes del nodo contexto. No podemos escribir //parrafo, dado que seleccionaría todos los descendientes del nodo raíz. Por ello, la forma correcta es: .//parrafo

otro ej. self::node()/descendant-or-self::node()/child::name se reemplaza por .//name

parent::node() se abrevia .. Realiza un paso hacia atrás en el árbol de nodos (especifica a los

padres), por ejemplo: /../../ sube 2 niveles ej. parent::node()/child::title se reemplaza por ../title

position()= se omite ej. [position()=1] se reemplaza por [1]

Expresiones de camino…

Page 31: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Sintaxis abreviada...

Ancestor no tiene ninguna forma abreviada, sino que hay que ponerlo como ancestor::

Ejemplos con sistaxis abreviada

a selecciona los elementos hijo con nombre a del nodo contexto

* selecciona los elementos hijos del nodo contexto

node() selecciona los elementos y texto hijos del nodo contexto

@a selecciona el atributo con nombre a del nodo contexto

@* selecciona todos los atributos del nodo contexto

*/a seleccioma todos los elementos nietos con nombre a del nodo contexto

/doc/chapter[5]/section[2] es una abreviación de:

/child::doc/child::chapter[position()=5]/child::section[position()=2]

Expresiones de camino…

Page 32: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Ejemplos con sistaxis abreviada

chapter//a es una abreviación dechapter/descendant-or-self::node()/child::a

//a es una abreviación de /descendant-or-self::node()/child::a

./a es una abreviación de self::node()/child::a, y es equivalente a child::a

chapter/./a es una abreviación de child::chapter/self::node()/child::a, y es equivalente a child::chapter/child::a o chapter/a

*/.. es una abreviación de child::*/parent::node() Selecciona el nodo contexto si tiene hijos, en caso contrario nada es selecc.

/descendant::a[1] es una abreviación de /descendant::a[position()=1] selecciona el primer nombre a descendiente de la raiz

Expresiones de camino…

Page 33: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Prueba de nodos (node tests)

* devuelve todo nodo del tipo principal que son: elemento, atributo o espacio de nombres, pero no nodos de texto, comentarios, y de instrucciones de proceso. Ejemplo:

Seleccionar todos los nodos principales descendientes de parrafo:

//parrafo/*

comment()

Devuelve cualquier nodo de tipo comentario.

processing-instruction()

Devuelve cualquier nodo del tipo instrucción de proceso.

node() devuelve todos los nodos de todos los tipos.

Seleccionar todos los nodos descendientes de parrafo:

//parrafo/node()

Expresiones de camino…

Page 34: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

text() devuelve nodos de tipo texto.

Mientras que /banco/cliente/nombre_cliente devolvería: <nombre_cliente>José</nombre_cliente> <nombre_cliente>María</nombre_cliente>

La expresión /banco/cliente/nombre_cliente/text( ) devuelve los mismos nombres pero sin etiquetas: José Maria

Seleccionar todo el texto que cuelga de todos los nodos parrafo:

//parrafo//text()

Expresiones de camino…

Page 35: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

<banco-2> <cuenta número-cuenta=“A-401” clientes=“C100 C102”> <sucursal> Centro </sucursal> <saldo> 500 </saldo> </cuenta> <cliente cliente-id=“C100” cuentas=“A-401”> <nombre-cliente>José< /nombre-cliente> <calle-cliente>Mártires< /calle-cliente> <ciudad-cliente>Mendoza< /ciudad-cliente> </cliente> <cliente cliente-id=“C102” cuentas=“A-401 A-402”> <nombre-cliente>María</nombre-cliente> <calle-cliente>P.Argentinos</calle-cliente> <ciudad-cliente>San Juan</ciudad-cliente> </cliente ></banco-2> banco2/cuenta [saldo > 400]

<cuenta número-cuenta=“C-401” clientes=“C100 C102”> <sucursal> Centro </sucursal> <saldo>500 </saldo> </cuenta>banco2/cuenta [saldo > 400]/@número-cuentaA-401banco-2/cliente/nombre-cliente/text()JoséMaría

Consultas y resultados:

Page 36: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Predicados de selección

Para restringir la selección de nodos se utilizan predicados.

Los predicados se incluyen dentro de una expresión de camino utilizando corchetes [ ], veamos un par de ejemplos:

Ejemplo:Seleccionar todos los elementos parrafo de todos los elementos capitulo que tengan un atributo llamado num al cual se le haya asignado el valor "1" (recordemos que en XML los atributos tienen valores de tipo string).

/libro/capitulo[@num="1"]/parrafo

Ejemplo: Seleccionar todos los elementos capitulo que tengan un parrafo que tenga algún elemento con atributo href:

//capitulo[parrafo/*[@href]]

Expresiones de camino…

Page 37: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Predicados..

Los predicados se pueden suceder uno a otro haciendo el efecto de la operación AND. Como en el siguiente ejemplo.

Ejemplo: Seleccionar todos los elementos capítulo que tengan un párrafo que tenga algún elemento con atributo href y que ellos mismos (los capitulos) tengan el atributo llamado public en valor “si”:

//capitulo[parrafo/*[@href]][@public='si']

También se puede hacer uso del operador and encerrando entre paréntesis los distintos predicados logicos.

//capitulo[(parrafo/*[@href]) and (@public='si')]

También se puede hacer uso de la operación or.

Expresiones de camino…

Page 38: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Expresiones de camino…

Predicados..

El operador “|” es usado para implementar union y se aplica entre dos expresiones XPath.

Ejemplo: Seleccionar los clientes que tengan cuentas o préstamos /banco/cuenta/id(@propietario) | /banco/prestamo/id(@prestatario) 

Por último, también podemos especificar con not la negación de alguna condición.

Ejemplo: Seleccionar todos los capitulos que no tengan el atributo public

//capitulo[not(@public)]

función id()… ver + adelante

Page 39: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Predicados con funciones Xpath

Existen ciertas funciones que sirven para restringir el conjunto de nodos devueltos en una expresión XPath. Tales funciones son:

position(), last() e id().

position()

Seleccionar el segundo capitulo:

//capitulo[position()=2]

Esta función se puede simular poniendo simplemente el número entre corchetes. Para seleccionar el segundo capitulo:

//capitulo[2]

Expresiones de camino…

Page 40: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Predicados con funciones Xpath..

last()

Seleccionar el último capitulo:

//capitulo[last()]

Seleccionar todos los capítulo menos el último:

//capitulo[not(position()=last())]

Estas funciones se pueden usar con expresiones matemáticas, como en el siguiente ejemplo.

Seleccionar el penúltimo capitulo:

//capitulo[last()-1]

Expresiones de camino…

Page 41: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

funciones Xpath..

id(): IDREFs pueden ser referenciados usando la función id()Puede ser aplicado a conjuntos de referencias IDREFS y aún a strings conteniendo múltiples referencias separadas por blancos.

Seleccionar los parrafos hijos del elemento con id="capitulo_1" :

id( "capitulo_1" )/parrafo

Seleccionar todos los clientes referenciados desde el atributo propietario de los elementos cuenta.

/banco/cuenta /id(@propietarios)

Hay que tener en cuenta un detalle. Solo se podrá usar en aquellos documentos XML que sean validados por un DTD en el que se especifique que el atributo id es único.

Expresiones de camino…

Page 42: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Predicados con funciones Xpath..

La función count() cuenta el número de elementos del conjunto generado por el path.

Seleccionar cuentas que pertenecen a más de 2 clientes

/banco/cuenta[count(./@propietarios) > 2]

La función doc(nombre) devuelve la raiz del documento citado, permite acceder a datos de otro archivo XML.

Expresiones de camino…

Page 43: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

<?xml version="1.0"?><purchaseOrder orderDate=“2004-10-20"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <comment>Hurry, my lawn is going wild!</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>2004-12-21</shipDate> </item> </items> </purchaseOrder>

El documento seEncuentra en el archivo ‘po.xml’

Xpath como lenguaje de consulta para XML

Page 44: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Seleccionar la fecha de la orden de compra si fue enviada a Belgica:

document(“po.xml”)/purchaseOrder/@orderDate[../shipTo/@country=“Belgium”]

document(“po.xml”)/purchaseOrder[shipTo/@country=“Belgium”]/@orderDate

Seleccionar el item que fué enviado a Mechelen cuyo precio es mayor que 40:

document(“po.xml”)//item[USPrice/text()>40 and (../../billTo/city/text()="Mechelen")]

Seleccionar la orden de compra si el precio de todos sus items es mayor que 40:

document(“po.xml”)/purchaseOrder[not(.//USPrice/text()<=40)]

Seleccionar la orden de compra si el precio de alguno de sus items es > 40:

document(“po.xml”)/purchaseOrder[.//USPrice/text>40]

Page 45: Introducción: XPath es el resultado de un esfuerzo para proporcionar una sintaxis y semántica comunes para funcionalidades compartidas entre XSL Transformations

Seleccionar la orden de compra si contiene al menos 2 items:

document(“po.xml”)/purchaseOrder[items/item[2]]

Dado un item, seleccione el precedente en la misma orden de compra:

preceding-sibling::*[1]

Seleccione la fecha en la cual hay una orden de compra que se paga en la Misma ciudad a la que se envía:

document(“po.xml”)/purchaseOrder/@orderDate[../shipTo/city/text()=../billTo/city/text()]