270 likes | 525 Views
XML. XPath. ¿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
E N D
XML XPath
¿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:
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 • 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> • <BBB/> • <CCC> • <DDD> • <EEE/> • </DDD> • </CCC> • <BBB/> • <BBB/> • <DDD> • <BBB/> • </DDD> • <CCC/> • </AAA> • Xpath: /AAA/DDD/BBB • <AAA> • <BBB/> • <CCC/> • <BBB/> • <BBB/> • <DDD> • <BBB/> • </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/> <BBB/> <DDD> <CCC> <EEE> <XXX/> </EEE> </CCC> </DDD> <CCC> <DDD> <BBB/> <BBB/> <CCC/> </DDD> </CCC> </AAA> • Xpath: //BBB • <AAA> • <BBB/> • <CCC/> • <BBB/> • <BBB/> • <DDD> • <BBB/> • </DDD> • <CCC/> • </AAA>
Paths compuestos (III) • Selección del nodo padre • Sintaxis: .. • Ejemplos • Xpath: //BBB/.. • <AAA> • <BBB/> • <CCC/> • <BBB/> • <BBB/> • <DDD> • <BBB/> • </DDD> • <CCC/> • </AAA> • Xpath: /AAA/DDD/CCC/.. • <AAA> • <BBB/> • <CCC/> • <BBB/> • <DDD> • <CCC> • <EEE/> • </CCC> • </DDD> • <DDD> • <DDD> • <BBB/> • <BBB/> • <CCC/> • </DDD> • </DDD> • </AAA>
Paths compuestos (IV) • Selección del nodo contexto • Sintaxis: . • Ejemplos • Xpath: //BBB/. • <AAA> • <BBB/> • <CCC/> • <BBB/> • <BBB/> • <DDD> • <BBB/> • </DDD> • <CCC/> • </AAA> • Xpath: /AAA/DDD/. • <AAA> • <BBB/> • <CCC/> • <BBB/> • <DDD> • <CCC> • <EEE/> • </CCC> • </DDD> • <DDD> • <DDD> • <BBB/> • <BBB/> • <CCC/> • </DDD> • </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: ‘<‘ ‘<’ • 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: /AAA/BBB/descendant::*<AAA> • <BBB> • <DDD> • <CCC> • <DDD/> • <EEE/> • </CCC> • </DDD> • </BBB> • <CCC> • <DDD> • <EEE> • <DDD> • <FFF/> • </DDD> • </EEE> • </DDD> • </CCC> • </AAA> • Xpath:/AAA/BBB/DDD/CCC/ancestor::*<AAA> • <BBB> • <DDD> • <CCC> • <DDD/> • <EEE/> • </CCC> • </DDD> • </BBB> • <CCC> • <DDD> • <EEE> • <DDD> • <FFF/> • </DDD> • </EEE> • </DDD> • </CCC> • </AAA> • Xpath://CCC/preceding-sibling::* • <AAA> • <BBB> • <DDD> • <EEE/> • <CCC> • <DDD/> • <EEE/> • </CCC> • </DDD> • </BBB> • <CCC> • <DDD> • <EEE> • <DDD> • <FFF/> • </DDD> • </EEE> • </DDD> • </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() mod 2 = 0] • <AAA> • <DDD> • <BBB id="a1"/> • <BBB id="a2"/> • <BBB id="a3"/> • <BBB id="a4"/> • <BBB id="a5"/> • <CCC/> • <CCC/> • </DDD> • <DDD> • <CCC/> • <BBB id="b1"/> • <BBB id="b2"/> • <BBB id="b3"/> • <BBB id="b4"/> • </DDD> • </AAA> • XPath: //BBB[last()] • <AAA> • <DDD> • <BBB id="a1"/> • <BBB id="a2"/> • <BBB id="a3"/> • <BBB id="a4"/> • <BBB id="a5"/> • <CCC/> • <CCC/> • </DDD> • <DDD> • <CCC/> • <BBB id="b1"/> • <BBB id="b2"/> • <BBB id="b3"/> • <BBB id="b4"/> • </DDD> • </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-length(name()) > 3] • <AAA> • <Q/> • <SSSS/> • <BB/> • <CCC/> • <DDDDDDDD/> • <EEEE/> • </AAA> • XPath: //@*[substring(.,2) > 2] • <AAA> • <DDD> • <BBB id="a1"/> • <BBB id="a2"/> • <BBB id="a3"/> • <BBB id="a4"/> • <BBB id="a5"/> • <CCC/> • <CCC/> • </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>