Está en la página 1de 27

XPath

Curso: XML, de los datos a la presentación


Julio de 2005
CAPTIVA · www.captiva.es
¿Qué es Xpath?
 Lenguaje para identificar partes de
documento XML
 No es XML
 Es parte de XSL (XSLT, XSL-FO)
 Utilizado fuera de XSL: XPointer,
XForms
Estructura en árbol (II)
 Todo documento XML es un árbol de nodos
 Cada nodo contiene otros nodos
 Nodo raíz  Nodo imaginario del que cuelgan los
demás. No es el elemento raíz
 Nodo hoja  Si no tiene descendientes (p.e. texto,
comentario, elemento sin atributos ni contenido)
 Resto de nodos:
 Nodo elemento
 Nodo de texto
 Nodo de atributo
 Nodo de comentario
 Nodo de PI
 Nodo de namespace
Estructura en árbol (III)
 Veamos un fichero XML y su representación en árbol:
<?xml version="1.0"?>
<!-- Dee-licious! -->
<sandwich xmlns="http://www.food.org/ns">
<ingredient type="grape">jelly</ingredient>
<ingredient><?knife spread thickly?>peanut-butter</ingredient>
<ingredient>bread<!-- white bread, preferably --></ingredient>
</sandwich>
Estructura en árbol (IV)
 Algunas consideraciones
 Los elementos <!DOCTYPE >, <![CDATA[
]]> no se incluyen en el árbol  No
direccionables por Xpath
 Las entidades se resuelven previamente 
Es posible que haya atributos tipo #FIXED
añadidos por DTD que no estén físicamente
en XML
 Los atributos xmlns y xmlns:prefijo no se
tienen en cuenta
Location Paths
 ¿Qué es un location path?
 Una expresión que localiza uno o varios nodos dentro de un documento
 Compuesta por location steps que se evalúan relativamente al nodo “actual” denominado
context node
 Location path raíz
 Sintaxis: /
 Sitúa el context node en el nodo raíz
 Localización de elementos hijos
 Sintaxis: nombre-hijo
 Ejemplo. Si el nodo contexto es DDD y evaluamos la expresión Xpath: BBB,
seleccionaría:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Location Paths (II)
 Localización de atributos
 Sintaxis: @nombre-atributo
 Ejemplo. Selección de todos los atributos “id”.
 Se introduce localización desde nodo raíz “/”
 Doble barra implica todo el documento “//”
 XPath: //@id
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
Location Paths (III)
 Localización de comentarios, PI, texto
 Sintaxis respect.: comment() text() processing-
instruction()
 Ejemplo. Selección de comentarios del texto. Nodo contexto
 Nodo raíz.
 XPath:comment()
<!-- Primer comentario -->
<AAA>
<BBB/>
<BBB/>
<BBB/>
<!-- Segundo comentario -->
<BBB/>
</AAA>
Location Paths (IV)
 Comodines
Comodín Significado
* Todos los nodos elemento
node() Todos los nodos
@* Todos los atributos

 Ejemplo. Supongamos que nodo contexto es el nodo raíz.


 XPath: node()
<!-- Un comentario al principio -->
<AAA>
<XXX>
<DDD>
<!-- Un comentario -->
<BBB/>
<BBB/>
<EEE/>
<FFF/>
<?pi una pi cualquiera?>
</DDD>
</XXX>
<YYY/>
</AAA>
Location Paths (V)
 Grupos de Location Paths
 Sintaxis: path1 | path2 | path3
 Ejemplo
 Path de contexto  AAA
 Xpath: CCC | EEE

<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Paths compuestos
 Los location Paths pueden concatenarse con
“/”
 Ejemplos Xpath: /AAA/*/*
<AAA>
Xpath: /AAA/DDD/BBB
<BBB/>
<AAA>
<CCC>
<BBB/>
<DDD>
<CCC/>
<EEE/
<BBB/>
</DDD>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
<BBB/>
</DDD>
<DDD>
<CCC/>
<BBB/>
</AAA>
</DDD>
<CCC/>
</AAA>
Paths compuestos (II)
 Selección de todos los descendientes
 Sintaxis: //
 Si se expresa en primer lugar indica todos los descendientes
desde el raíz
 Ejemplos Xpath: /AAA/DDD//*
<AAA>
<BBB/>
<CCC/>
Xpath: //BBB <BBB/>
<AAA> <DDD>
<CCC>
<BBB/> <EEE>
<CCC/> <XXX/>
</EEE>
<BBB/> </CCC>
<BBB/> </DDD>
<DDD> <CCC>
<DDD>
<BBB/>
<BBB/> <BBB/>
<CCC/>
</DDD> </DDD>
<CCC/> </CCC>
</AAA> </AAA>
Paths compuestos (III)
 Selección del nodo padre
 Sintaxis: ..
 Ejemplos
Xpath: //BBB/.. Xpath: /AAA/DDD/CCC/..
<AAA>
<AAA> <BBB/>
<BBB/> <CCC/>
<BBB/>
<CCC/> <DDD>
<BBB/> <CCC>
<BBB/> <EEE/>
</CCC>
<DDD> </DDD>
<DDD>
<DDD>
<BBB/> <BBB/>
</DDD> <BBB/>
<CCC/> <CCC/>
</DDD>
</AAA> </DDD>
</AAA>
Paths compuestos (IV)
 Selección del nodo contexto
 Sintaxis: .
 Ejemplos
Xpath: //BBB/. Xpath: /AAA/DDD/.
<AAA>
<AAA> <BBB/>
<BBB/> <CCC/>
<BBB/>
<CCC/> <DDD>
<BBB/> <CCC>
<BBB/> <EEE/>
</CCC>
<DDD> </DDD>
<DDD>
<DDD>
<BBB/> <BBB/>
</DDD> <BBB/>
<CCC/> <CCC/>
</DDD>
</AAA> </DDD>
</AAA>
Predicados
 Filtros para refinar más un location path
 Consisten en expresiones booleanas
 Se aplican a cada Location path por separado
 Sintaxis: path[expresion-booleana]
 Ejemplos:
 Primer nodo AAA en todo el documento
 //AAA[1]
 Evaluación del contenido del nodo elemento
 //AAA[.=“contenido”]
 Evaluación de nodos con atributo dado o atributo con valor dado
 //AAA[@id]
 //AAA[@id=‘1234’]
 Nodos con nombre de elemento dado
 //*[name()=‘AAA’]  //AAA
 Comparación de valores: < > <= >= = !=
 //AAA[@id >= 12]
 Ojo: Si Xpath detro de XML: ‘<‘  ‘&lt;’
 Concatenaciones booleanas: and, or
 //AAA[@id >= 12 and @id < 20]
Location Paths sin abreviar
 Hasta ahora hemos visto forma abreviada (/, .., //, .) 
La más utilizada
 Location path completo compuesto por:
eje::test-nodos[predicado]
 Partes
 eje: Indica la dirección en la que viajar
 test-nodos: Condición que han de cumplir los nodos
 predicado: Expresiones booleanas adicionales. Opcional
 Ejemplo
 Versión abreviada: AAA/BBB/CCC/@id
 Versión sin abreviar:
child::AAA/child::BBB/child::CCC/attribute::id
Location Paths sin abreviar (II)
 Tipos de ejes
 Equivalentes a forma abreviada: child (nombre), self (self::*.),
parent (parent::*  ..)
 Nuevos. Siempre con referencia del nodo de contexto
 ancestor  nodo padre y ascendencia hasta raíz
 ancestor-or-self  incluye el nodo contexto
 descendant  nodos hijos y descendencia
 descendant-or-self  incluye el nodo contexto
 following-sibling  siguientes nodos al mismo nivel que el de
contexto hijos del mismo padre
 preceding-sibling  como el anterior pero anteriores al nodo
contexto
 preceding  anteriores nodos hasta ppio del doc a cualquier nivel
 following  siguientes nodos hasta fin del doc a cualquier nivel
 namespace  todos los nodos de un namespace
Location Paths sin abreviar
(III)
 Ejemplos forma completa
Xpath: Xpath:/AAA/BBB/DDD/CC Xpath://CCC/preceding-
/AAA/BBB/descendant::* C/ancestor::* <AAA> sibling::*
<AAA> <BBB>
<AAA>
<BBB> <DDD>
<BBB>
<DDD> <CCC>
<DDD>
<CCC> <DDD/>
<EEE/>
<DDD/> <EEE/>
<CCC>
<EEE/> </CCC>
<DDD/>
</CCC> </DDD>
<EEE/>
</DDD> </BBB>
</CCC>
</BBB> <CCC>
</DDD>
<CCC> <DDD>
</BBB>
<DDD> <EEE>
<CCC>
<EEE> <DDD>
<DDD>
<DDD> <FFF/>
<EEE>
<FFF/> </DDD>
<DDD>
</DDD> </EEE>
<FFF/>
</EEE> </DDD>
</DDD>
</DDD> </CCC>
</EEE>
</CCC> </AAA>
</DDD>
</AAA>
</CCC>
</AAA>
Expresiones generales
 Otras expresiones aparte de Location Paths
 Numéricas
 Cadenas
 Booleanas
 Números
 Expresión Xpath válida: 3.141529
 Todos los números Xpath se consideran 8-byte, IEEE 754
(doubles de Java). ±4.94065645841246544e-324 ~
±1.79769313486231570e+308
 Operaciones permitidas: + - * div mod
 Ejemplo expresión XPath:
 (8.5E45 * 2) mod @id
Expresiones generales (II)
 Cadenas
 Cualquier cadena unicode es una expresión Xpath válida
 Únicamente no puede contener el carácter que la delimite (‘ ó
“).
 Ejemplos: “hola” “τσπξχ” “‫”ضغلمنسش‬
 Las cadenas se pueden comparar  “hola” != “Hola”
 Booleanos
 Valores: true() false()
 Las comparaciones devuelven booleanos: “1.5” >= “-
1.2”
 Los operadores lógicos agrupan booleanos:
 not( (1.5 < 5) and true() ) or false()
Funciones
 Xpath dispone de varias funciones. Las funciones pueden
devolver: booleanos, números, grupos de nodos, cadenas
 Las conversiones automáticas son posibles excepto desde y
hacia grupos de nodos
 Funciones de nodos
 position() Devuelve número de nodo dentro de la lista de
nodos de contexto (XSLT)
<xsl:template match="person">
Person <xsl:value-of select="position( )"/>,
<xsl:value-of select="name"/>
</xsl:template>
 last()  Devuelve el último nodo de la lista de contexto
 count(nodeset)  Cuenta el nº de nodos del conjunto pasado
como argumento
 Ej. count(//BBB)  2
Funciones (II)
 Funciones de nodos (II)
 id(nodeset) Devuelve nodo con atributo
definido como ID en DTD igual a argumento
 Ej. id(“a1234”)  <persona
identidad=“a1234”>
 local-name(nodeset)  Nombre de primer
nodo en nodeset sin prefijo
 name(nodeset)  Nombre de primer nodo
completo
 Ejemplo: name(//aa:AAA) = “aa:AAA”, local-
name(//aa:AAA) = “AAA”
 namespace-uri(nodeset)  Devuelve uri de
namespace de primer nodo en nodeset
Funciones (III)
 Ejemplos funciones de nodo
XPath: //BBB[position() XPath: //BBB[last()]
mod 2 = 0] <AAA>
<AAA> <DDD>
<DDD> <BBB id="a1"/>
<BBB id="a1"/> <BBB id="a2"/>
<BBB id="a2"/> <BBB id="a3"/>
<BBB id="a3"/> <BBB id="a4"/>
<BBB id="a4"/> <BBB id="a5"/>
<BBB id="a5"/> <CCC/>
<CCC/> <CCC/>
<CCC/> </DDD>
</DDD> <DDD>
<DDD> <CCC/>
<CCC/> <BBB id="b1"/>
<BBB id="b1"/> <BBB id="b2"/>
<BBB id="b2"/> <BBB id="b3"/>
<BBB id="b3"/> <BBB id="b4"/>
<BBB id="b4"/> </DDD>
</DDD> </AAA>
</AAA>
Funciones (IV)
 Funciones de cadena
 string(cualquier-cosa) Convierte a cadena
 Ej. string(true())  “true”
 Con nodesets saca texto de primer nodo
 <a>aa<b>bb</b></a>  string(//*) = “aa”
 starts-with(cadena-completa,subcadena)
 Ej. starts-with(“Pepelui”, “Pe”)  true()
 contains(cadena-completa,subcadena)
 Ej: contains(“aeIou”, “eI”)  true()
 substring-before(cadena, subcadena)
 Ej: substring-before(“DD/MM/AAAA”, “/”)  “DD”
 substring-after(cadena, subcadena)
 Ej: substring-after(“DD/MM/AAAA”, “/”)  “MM/AAAA”
 substring (cadena, inicio [,longitud])
 Ej: substring(“DD/MM/AAAA”, 3)  “/MM/AAAA”
 string-length(cadena)
 Ej: substring(“DD/MM/AAAA”, 3)  “/MM/AAAA”
 normalize-space(cadena)  Elimina espacios extra
Funciones (V)
 Ejemplos funciones cadenas
XPath: //*[string- XPath:
length(name()) > 3] //@*[substring(.,2) > 2]
<AAA>
<AAA> <DDD>
<Q/> <BBB id="a1"/>
<SSSS/> <BBB id="a2"/>
<BB/> <BBB id="a3"/>
<CCC/> <BBB id="a4"/>
<BBB id="a5"/>
<DDDDDDDD/>
<CCC/>
<EEEE/> <CCC/>
</AAA> </DDD>
<DDD>
<CCC/>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB id="b3"/>
<BBB id="b4"/>
</DDD>
</AAA>
Funciones (VI)
 Funciones booleanas
 true() false() not(expr)
 Funciones numéricas
 number()  convierte a número
 number(nodeset) = number(string(nodeset))
 Ej.: number(“7.5”) = 7.5 number(“Pedro”) = NaN
 Extracción de parte entera
 round(4.6) = 5
 floor(4.6) = 4
 ceiling(4.2) = 5
 sum(nodeset)  Convierte cada nodo en número y lo
suma
Funciones (VII)
 Ejemplo funciones numéricas
XPath: //BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 +
0.5) ]
<AAA>
<BBB id="1"/>
<BBB id="2"/>
<BBB id="3"/>
<BBB id="4"/>
<BBB id="5"/>
<BBB id="6"/>
<BBB id="7"/>
<BBB id="8"/>
<CCC/>
<CCC/>
<CCC/>
</AAA>

También podría gustarte