XPath 2.0 es una versión del lenguaje XPath definido por el World Wide Web Consortium , W3C. Se convirtió en una recomendación el 23 de enero de 2007. [1] Como recomendación del W3C fue reemplazada por XPath 3.0 el 10 de abril de 2014.
XPath se utiliza principalmente para seleccionar partes de un documento XML . Para ello, el documento XML se modela como un árbol de nodos. XPath permite seleccionar nodos mediante una ruta de navegación jerárquica a través del árbol del documento.
El lenguaje es significativamente más grande que su predecesor, XPath 1.0 , y algunos de los conceptos básicos, como el modelo de datos y el sistema de tipos, han cambiado. Por lo tanto, las versiones en dos idiomas se describen en artículos separados.
XPath 2.0 se usa como un sublenguaje de XSLT 2.0 y también es un subconjunto de XQuery 1.0. Los tres lenguajes comparten el mismo modelo de datos ( XDM ), sistema de tipos y biblioteca de funciones, y se desarrollaron juntos y se publicaron el mismo día.
Modelo de datos
Cada valor en XPath 2.0 es una secuencia de elementos . Los elementos pueden ser nodos o valores atómicos . Se considera que un nodo individual o valor atómico es una secuencia de longitud uno. Es posible que las secuencias no estén anidadas.
Los nodos son de siete tipos, correspondientes a diferentes construcciones en la sintaxis de XML : elementos, atributos, nodos de texto, comentarios, instrucciones de procesamiento, nodos de espacio de nombres y nodos de documento. (El nodo de documento reemplaza al nodo raíz de XPath 1.0 , porque el modelo XPath 2.0 permite que los árboles se arraiguen en otros tipos de nodos, en particular elementos).
Los nodos se pueden escribir o no. Un nodo adquiere un tipo como resultado de la validación con un esquema XML . Si un elemento o atributo se valida con éxito contra un tipo complejo particular o un tipo simple definido en un esquema, el nombre de ese tipo se adjunta como una anotación al nodo y determina el resultado de las operaciones aplicadas a ese nodo: por ejemplo, cuando ordenando, los nodos que se anotan como números enteros se ordenarán como números enteros.
Los valores atómicos pueden pertenecer a cualquiera de los 19 tipos primitivos definidos en la especificación del esquema XML (por ejemplo, cadena, booleano, doble, flotante, decimal, dateTime, QName, etc.). También pueden pertenecer a un tipo derivado de uno de estos tipos primitivos: ya sea un tipo derivado incorporado como entero o Nombre, o un tipo derivado definido por el usuario definido en un esquema escrito por el usuario.
Tipo de sistema
El sistema de tipos de XPath 2.0 es digno de mención por el hecho de que combina mecanografía fuerte y escritura débil en un solo idioma.
Operaciones como la aritmética y la comparación booleana requieren valores atómicos como operandos. Si un operando devuelve un nodo (por ejemplo, @price * 1.2
), el nodo se atomiza automáticamente para extraer el valor atómico. Si el documento de entrada se ha validado con un esquema, el nodo normalmente tendrá una anotación de tipo, y esto determina el tipo de valor atómico resultante (en este ejemplo, el price
atributo podría tener el tipo decimal
). Si no se utiliza ningún esquema, el nodo no se escribirá y el tipo del valor atómico resultante será untypedAtomic
. Los valores atómicos escritos se verifican para asegurarse de que tengan un tipo apropiado para el contexto en el que se utilizan: por ejemplo, no es posible multiplicar una fecha por un número. Los valores atómicos sin tipo, por el contrario, siguen una disciplina de escritura débil: se convierten automáticamente a un tipo apropiado para la operación en la que se utilizan: por ejemplo, con una operación aritmética, un valor atómico sin tipo se convierte al tipo double
.
Expresiones de ruta
Las rutas de ubicación de XPath 1.0 se denominan en XPath 2.0 expresiones de ruta . De manera informal, una expresión de ruta es una secuencia de pasos separados por el /
operador " ", por ejemplo a/b/c
(que es la abreviatura de child::a/child::b/child::c
). Más formalmente, sin embargo, " /
" es simplemente un operador binario que aplica la expresión en su lado derecho a cada elemento seleccionado a su vez por la expresión en el lado izquierdo. Entonces, en este ejemplo, la expresión a
selecciona todos los elementos secundarios del nodo de contexto que se nombran ; la expresión
child::b
se aplica luego a cada uno de estos nodos, seleccionando todos los hijos de los
elementos; y luego la expresión
child::c
se aplica a cada nodo en esta secuencia, que selecciona todos los
hijos de estos elementos.
El /
operador " " está generalizado en XPath 2.0 para permitir que se utilice cualquier tipo de expresión como operando: en XPath 1.0, el lado derecho era siempre un paso de eje. Por ejemplo, se puede utilizar una llamada a función en el lado derecho. Las reglas de escritura para el operador requieren que el resultado del primer operando sea una secuencia de nodos. El operando de la derecha puede devolver nodos o valores atómicos (pero no una mezcla). Si el resultado consta de nodos, los duplicados se eliminan y los nodos se devuelven en el orden del documento , un orden definido en términos de las posiciones relativas de los nodos en el árbol XML original.
En muchos casos, los operandos de " /
" serán pasos de eje: estos son prácticamente los mismos que XPath 1.0 y se describen en el artículo sobre XPath 1.0 .
Otros operadores
Otros operadores disponibles en XPath 2.0 incluyen los siguientes:
Operadores | Efecto |
---|---|
+, -, *, div, mod, idiv | Aritmética sobre números, fechas y duraciones |
=,! =, <,>, <=,> = | Comparación general: compare secuencias arbitrarias. El resultado es verdadero si cualquier par de elementos, uno de cada secuencia, satisface la comparación |
eq, ne, lt, gt, le, ge | Comparación de valor: compare artículos individuales |
es | Comparar la identidad del nodo: verdadero si ambos operandos son el mismo nodo |
<<, >> | Compare la posición del nodo, según el orden de los documentos |
unión, intersección, excepto | Comparar secuencias de nodos, tratándolos como conjuntos, devolviendo la unión, intersección o diferencia del conjunto |
y, o | conjunción y disyunción booleana. La negación se logra utilizando la not() función. |
a | define un rango de enteros, por ejemplo 1 to 10 |
en vez de | determina si un valor es una instancia de un tipo determinado |
emitir como | convierte un valor en un tipo determinado |
moldeable como | prueba si un valor es convertible a un tipo determinado |
Las expresiones condicionales se pueden escribir usando la sintaxis if (A) then B else C
.
XPath 2.0 también ofrece una for
expresión, que es un pequeño subconjunto de la expresión FLWOR de XQuery . La expresión for $x in X return Y
evalúa la expresión Y
para cada valor en el resultado de la expresión X
a su vez, refiriéndose a ese valor utilizando la referencia de variable $x
.
Biblioteca de funciones
La biblioteca de funciones en XPath 2.0 se amplía en gran medida desde la biblioteca de funciones en XPath 1.0. ( Los elementos en negrita están disponibles en XPath 1.0)
Las funciones disponibles incluyen las siguientes:
Propósito | Funciones de ejemplo |
---|---|
Manejo general de cuerdas | minúsculas, mayúsculas, subcadena , subcadena antes , subcadena después , traducir , comienza con , termina con, contiene , longitud de cadena , concat , normalizar-espacio , normalizar-unicode |
Expresiones regulares | coincidencias, reemplazar, tokenizar |
Aritmética | contar , suma , promedio, mínimo, máximo, redondo , piso , techo , abdominales |
Fechas y horas | Adjust-dateTime-to-timezone, current-dateTime, day-from-dateTime, month-from-dateTime, días desde la duración, meses desde la duración, etc. |
Propiedades de los nodos | nombre , nombre -nodo, nombre- local , espacio de nombres-uri , base-uri, nilled |
Manejo de documentos | doc, doc-available, document-uri, collection, id , idref |
URI | codificar-para-uri, escape-html-uri, iri-to-uri, resolve-uri |
QNames | QName, espacio de nombres-uri-from-QName, prefix-from-QName, resolve-QName |
Secuencias | insertar antes, eliminar, subsecuencia, índice de, valores distintos, invertir, desordenado, vacío, existe |
Comprobación de tipo | uno o más, exactamente uno, cero o uno |
Compatibilidad al revés
Debido a los cambios en el modelo de datos y el sistema de tipos, no todas las expresiones tienen exactamente el mismo efecto en XPath 2.0 que en 1.0. La principal diferencia es que XPath 1.0 era más relajado acerca de la conversión de tipos, por ejemplo, comparar dos cadenas ( "4" > "4.0"
) era bastante posible pero haría una comparación numérica; en XPath 2.0 esto se define para comparar los dos valores como cadenas usando una secuencia de clasificación definida por contexto.
Para facilitar la transición, XPath 2.0 define un modo de ejecución en el que la semántica se modifica para estar lo más cerca posible del comportamiento de XPath 1.0. Cuando se usa XSLT 2.0 , este modo se activa estableciendo version="1.0"
como un atributo en el xsl:stylesheet
elemento. Esto todavía no ofrece una compatibilidad del 100%, pero es probable que las diferencias restantes solo se encuentren en casos inusuales.
Apoyo
El soporte para XPath 2.0 aún es limitado.
- Para compatibilidad con el navegador, consulte Comparación de motores de diseño (XML) .
Referencias
- ^ "Cronología de estándares XML y Web semántica W3C" (PDF) . 4 de febrero de 2012.