XPath

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 8 de septiembre de 2017; las comprobaciones requieren 14 ediciones .

XPath (XML Path Language) es un lenguaje de consulta para elementos de un documento XML . Diseñado para acceder a partes de un documento XML en archivos de transformación XSLT y es un estándar W3C . XPath tiene como objetivo implementar la navegación DOM en XML . XPath usa una sintaxis compacta que es diferente de XML. La versión 2.0 se completó en 2007 y ahora forma parte del lenguaje XQuery 1.0. En diciembre de 2009, comenzó el desarrollo de la versión 2.1, que utiliza XQuery 1.1.

Por el momento, la versión más popular es XPath 1.0. Esto se debe a la falta de compatibilidad con XPath 2.0 de las bibliotecas de código abierto. En particular, estamos hablando de libxml2 , de la cual depende el soporte de idioma en los navegadores, por un lado, y el soporte del intérprete del servidor, por el otro.

Fundamentos

XML tiene una estructura de árbol. Un documento XML independiente siempre tiene un elemento raíz (la instrucción <?xml version="1.0"?> no tiene nada que ver con el árbol de elementos), en el que se permiten varios elementos anidados, algunos de los cuales también pueden contener elementos anidados. . También puede ver nodos de texto, comentarios e instrucciones. Puede pensar en un elemento XML como si contuviera una matriz de elementos anidados y una matriz de atributos.

Los elementos del árbol tienen elementos antepasados ​​y elementos descendientes (el elemento raíz no tiene antepasados ​​y los elementos de resguardo (hojas del árbol) no tienen hijos). Cada elemento del árbol se encuentra en un determinado nivel de anidamiento (en lo sucesivo, el "nivel"). Los elementos están ordenados en orden en el texto XML, por lo que podemos hablar sobre sus elementos anteriores y siguientes. Esto es muy similar a organizar directorios en un sistema de archivos.

La línea XPath describe cómo seleccionar los elementos deseados de una matriz de elementos, que pueden contener elementos anidados. La selección comienza con el conjunto de elementos pasado, en cada paso de la ruta, se seleccionan los elementos correspondientes a la expresión del paso y, como resultado, se selecciona un subconjunto de elementos correspondientes a la ruta dada.

Por ejemplo, tome el siguiente documento XHTML :

< html > < cuerpo > < div > Primera capa < span > bloque de texto en la primera capa </ span > </ div > < div > Segunda capa </ div > < div > Tercera capa < abarcan clase = "texto" > primer bloque en la tercera capa </ abarcan > < abarcan clase = "texto" > segundo bloque en la tercera capa </ abarcan > < span > tercer bloque en tercera capa </ span > </ div > < span > cuarta capa </ span > < img /> </ cuerpo > </ html >

La ruta XPath /html/body/*/span[@class] coincidirá con dos elementos del documento de origen en él, <span class="text">первый блок в третьем слое</span>y <span class="text">второй блок в третьем слое</span>.

Los elementos de ruta se escriben predominantemente en XPath en forma abreviada. La forma completa de la ruta anterior es /child::html/child::body/child::*/child::span[attribute::class]

La ruta consta de pasos de direccionamiento, que están separados por una barra inclinada /.

Cada paso de direccionamiento consta de tres partes:

  • eje (hijo por defecto::, eje del elemento). Además de filtrar a lo largo del eje de elementos anidados, puede seleccionar a lo largo de varios otros ejes de elementos y a lo largo del eje de atributo (atributo::, también se indica con el símbolo @) (ver más abajo).
  • una expresión que define los elementos a seleccionar (en el ejemplo, la selección se realiza haciendo coincidir los elementos del documento con los nombres html, body, span, y se utiliza el símbolo *, que seleccionará todos los elementos del eje)
  • predicados (en este ejemplo es atributo::clase) — condiciones de selección adicionales. Puede haber varios. Cada predicado está encerrado entre corchetes e implica una expresión lógica para probar los elementos seleccionados. Si no hay predicado, se seleccionan todos los elementos coincidentes.

La ruta se analiza de izquierda a derecha y comienza en el contexto del primer elemento del nodo raíz (en este ejemplo, este es el elemento html), y luego a lo largo del eje child:: habrá elementos anidados en él (en este ejemplo, este es un elemento del cuerpo), lo cual es conveniente en el caso de que se procese un documento XML normal con un solo nodo raíz o, si el carácter se especifica al comienzo de XPath /, en contexto con todos los elementos raíz. del XML pasado a lo largo del eje child:: (en este ejemplo, será un solo elemento html). En cada paso de direccionamiento en el contexto actual, se seleccionan elementos que coinciden con las condiciones especificadas en el paso, y su lista se toma como contexto para el siguiente paso o como resultado de retorno.

Por lo tanto, el primer paso /child::htmlconvierte explícitamente el contexto actual para el siguiente paso en una lista de un elemento html, lo que se habría hecho implícitamente si no se hubiera especificado este paso.

En el segundo paso de direccionamiento de este ejemplo (el paso child::body), el contexto es una lista de un elemento html. El eje child:: dice que debe mirar los nombres de los elementos anidados en el contexto actual, y la condición de verificación del cuerpo dice que los nodos que tienen el cuerpo del nombre deben incluirse en el conjunto de elementos generado. Así, durante el segundo paso de direccionamiento, obtenemos un conjunto de nodos que consta de un solo elemento de cuerpo, que se convierte en el contexto para el tercer paso.

Tercer paso de direccionamiento: niño::* . El eje hijo:: contiene todos los hijos directos del elemento del cuerpo, y la condición de prueba * dice que los elementos del tipo principal con cualquier nombre deben incluirse en la lista generada. Durante este paso, obtenemos una lista que consta de tres elementos div, un elemento span y un elemento img, un total de cinco elementos.

Cuarto paso de direccionamiento: child::span/@class. Su contexto es una lista de cinco elementos, por lo que la lista saliente se crea en cinco pases (cinco iteraciones). En la primera iteración, el primer div se convierte en el nodo de contexto. Dado el eje hijo:: y la regla de prueba de intervalo, el conjunto debe incluir los elementos secundarios inmediatos de este div, cuyo nombre es igual a intervalo. Hay uno allí. En la segunda iteración, no se agregará nada al conjunto, ya que el segundo div no tiene hijos. La tercera iteración verá tres elementos de tramo a la vez. El cuarto no verá nada, ya que el elemento tramo no tiene descendientes de tramo, y el hecho de que sea un tramo en sí mismo no importa, porque son los descendientes los que se ven. El quinto tampoco verá nada, el elemento img tampoco tiene hijos de intervalo. Entonces, durante la prueba, se pudo obtener un conjunto de nodos que consta de cuatro elementos de tramo. Este sería el contexto para el procesamiento posterior si no se especificó ningún predicado en este paso.

Pero dado que hay un predicado en el cuarto paso, a medida que se realiza cada uno de los cinco pases, se realizará un filtrado adicional de los elementos seleccionados. En este caso, el atributo:: eje del predicado indica la necesidad de verificar si el nodo seleccionado tiene atributos, y la condición de clase requiere dejar solo aquellos nodos que tienen un atributo llamado clase. Y por lo tanto, en la primera iteración, el único tramo encontrado no pasará el filtrado por el predicado, en la tercera iteración, dos de los tres elementos pasarán el filtrado, y como resultado, a pesar de que el filtrado se realiza sobre cinco iteraciones, solo dos elementos de intervalo entran en el conjunto final.

Hachas

Los ejes son la base del lenguaje XPath. Hay abreviaturas para algunos ejes.

  • child::  - contiene un conjunto de elementos descendientes (elementos ubicados un nivel por debajo). Este nombre se abrevia completamente, es decir, se puede omitir por completo.
  • descendant::  - contiene el conjunto completo de elementos descendientes (es decir, tanto los elementos descendientes más cercanos como todos sus elementos descendientes). La expresión /descendant::node()/se puede acortar a //.
  • descendant-or-self::  contiene el conjunto completo de elementos descendientes y el elemento actual. Con la ayuda de este eje, por ejemplo, es posible organizar la selección de elementos de cualquier nodo, y no solo del nodo raíz, como segundo paso: basta con tomar todos los descendientes del nodo raíz como el primer paso. Por ejemplo, una ruta //spanseleccionará todos los nodos en el spandocumento, independientemente de su posición en la jerarquía, observando tanto el nombre del elemento raíz como los nombres de todos sus elementos secundarios, en toda su profundidad de anidamiento.
  • antepasado::  - contiene muchos elementos antecesores.
  • ancestor-or-self::  contiene el conjunto de elementos antecesores y el elemento actual.
  • parent::  - contiene el elemento antepasado un nivel atrás. Esta llamada puede ser reemplazada por..
  • self::  - contiene el elemento actual. Esta llamada puede ser reemplazada por.
  • siguiente::  - contiene un conjunto de elementos ubicados debajo del elemento actual en el árbol (en todos los niveles y capas), excluyendo sus propios descendientes.
  • follow-sibling::  contiene un conjunto de elementos hermanos que siguen a la capa actual.
  • precedente::  - contiene el conjunto de elementos por encima del elemento actual en el árbol (en todos los niveles y capas), excluyendo el conjunto de antepasados ​​propios.
  • precedente-hermano::  contiene un conjunto de elementos hermanos que preceden a la capa actual.
  • atributo::  - contiene un conjunto de atributos del elemento actual. Esta invocación puede ser reemplazada por el símbolo@
  • espacio de nombres::  - contiene un conjunto de elementos relacionados con un espacio de nombres particular (es decir, hay un atributo xmlns).

Una expresión que especifica los elementos para seleccionar

Dentro del contenido del eje , la selección se realiza de acuerdo a la expresión que define los elementos a seleccionar.

Como expresión puede ser

  • se especifica un nombre específico, luego se seleccionan los elementos del eje correspondientes a este nombre
  • se especifica el símbolo *, que seleccionará todos los elementos del eje
  • se especifica una expresión compuesta por funciones, y luego se seleccionarán los resultados del cálculo de la expresión en el contexto de cada elemento del eje

Las funciones se dividen en 5 grupos:

Funciones sobre conjuntos de nudos

Función Descripción
node-set node() Devuelve el propio nodo. En lugar de esta función, a menudo se usa el sustituto *, pero, a diferencia del asterisco, la función node()también devuelve nodos de texto
string text() Devuelve el nodo si es texto.
node-set current() Devuelve un conjunto de un elemento, que es el actual. Si configuramos el procesamiento con predicados, entonces la única forma de llegar al elemento actual desde este predicado será esta función
number position() Devuelve la posición de un elemento en el conjunto de elementos del eje. Funciona correctamente solo en bucle.<xsl:for-each/>
number last() Devuelve el número del último elemento del conjunto de elementos del eje. Funciona correctamente solo en bucle.<xsl:for-each/>
number count(node-set) Devuelve el número de elementos en node-set.
string name(node-set?) Devuelve el nombre completo de la primera etiqueta del conjunto.
string namespace-url(node-set?) Devuelve un enlace a una URL que especifica un espacio de nombres
string local-name(node-set?) Devuelve el nombre de la primera etiqueta del conjunto, sin un espacio de nombres
node-set id(object) Encuentra un elemento con una identificación única

Funciones de cadena

Función Descripción
string string(object?) Devuelve el contenido de texto del elemento. Esencialmente devuelve el conjunto combinado de elementos de texto un nivel hacia abajo
string concat(string, string, string*) Concatena las cadenas especificadas en los argumentos.
number string-length(string?) Devuelve la longitud de la cadena.
boolean contains(string, string) Devuelve truesi la primera línea contiene la segunda, de lo contrario:false
string substring(string, number, number?) Devuelve una cadena cortada de una cadena, comenzando en el número especificado y, si se especifica un segundo número, la cantidad de caracteres
string substring-before(string, string) Si la segunda cadena se encuentra dentro de la primera, devuelve la cadena hasta la primera aparición de la segunda cadena.
string substring-after(string, string) Si la segunda cadena se encuentra dentro de la primera, devuelve la cadena después de la primera aparición de la segunda cadena.
boolean starts-with(string, string) Devuelve truesi la segunda línea está al principio de la primera, de lo contrario:false
boolean ends-with(string, string) Devuelve truesi la segunda línea está al final de la primera, de lo contrario:false
string normalize-space(string?) Elimina espacios adicionales y repetidos, así como caracteres de control, reemplazándolos con espacios
string translate(string, string, string) Reemplaza los caracteres de la primera cadena que aparecen en la segunda cadena con los caracteres de la tercera cadena correspondientes a las posiciones de los caracteres de la segunda cadena. Por ejemplo, translate("bar", "abc", "ABC")devolverá BAr.

Funciones y operadores booleanos

símbolo, operador Sentido
or lógico "o"
and lógico "y"
= lógico "igual"
<(<) lógico "menor que"
>(>) lógico "mayor"
<=(<=) lógico "menor o igual que"
>=(>=) lógico "mayor que o igual"
Función Descripción
boolean boolean(object) Convierte un objeto en un tipo booleano
boolean true() devuelve verdadero
boolean false() devuelve falso
boolean not(boolean) Negación, devuelve verdadero si el argumento es falso y viceversa

Funciones y operadores numéricos

símbolo, operador Sentido
+ suma
sustracción
* multiplicación
div división regular ( ¡no entero! )
mod resto de la división
Función Descripción
number number(object?) Convierte un objeto en un número
number sum(node-set) Devuelve la suma del conjunto. Cada etiqueta establecida se convertirá en una cadena y se obtendrá un número de ella.
number floor(number) Devuelve el entero más grande no mayor que el argumento (redondeado hacia abajo)
number ceiling(number) Devuelve el entero más pequeño no menor que el argumento (redondeando hacia arriba)
number round(number) Redondea un número de acuerdo con reglas matemáticas.

Funciones del sistema

Función Descripción
node-set document(object, node-set?) Devuelve el documento especificado en el parámetro.object
string format-number(number, string, string?) Da formato a un número según el patrón especificado en el segundo parámetro. El tercer parámetro especifica el formato de número nombrado que se debe tener en cuenta.
string generate-id(node-set?) Devuelve una cadena que es un identificador único
node-set key(string, object) Devuelve un conjunto con la clave especificada (similar a la función idpara identificadores)
string unparsed-entity-uri(string) Devuelve el URI no analizado. Si no hay ninguno, devuelve una cadena vacía.
boolean element-available(string) Comprueba si el elemento o conjunto especificado en el parámetro está disponible. El parámetro se trata como XPath
boolean function-available(string) Comprueba si la función especificada en el parámetro está disponible. El parámetro se trata como XPath
object system-property(string) Parámetros que devuelven variables del sistema. Puede ser:
  • xsl: version - devuelve la versión XSLT del procesador.
  • xsl: vendor - devuelve el fabricante del procesador XSLT.
  • xsl: vendor-url - devuelve una URL que identifica al fabricante.

Si se usa un parámetro desconocido, la función devuelve una cadena vacía

boolean lang(string) Devuelve truesi la etiqueta actual tiene un atributo xml: lango si el padre de la etiqueta tiene un atributo xml: langy contiene el carácter que coincide con la cadena.

Predicados

Los predicados son expresiones lógicas entre corchetes, construidos según los mismos principios que la expresión de selección. Las expresiones que no devuelven un valor booleano sino un conjunto vacío de elementos se consideran falsas. Una expresión que devuelve un número se considera una expresión que compara el número con position(). Cuando hay más de un predicado, cada uno de ellos filtra los resultados del filtrado por el predicado anterior.

Otras notaciones en XPath

Designacion Descripción
* Indica cualquier nombre o conjunto de caracteres a lo largo del eje especificado, por ejemplo: * - cualquier nodo secundario; @* - cualquier atributo
$name Acceso a una variable. name — nombre de variable o parámetro
[] Condiciones de selección adicionales (o predicado de paso de direccionamiento). Debe contener un valor booleano. Si contiene un valor numérico, se considera que es el número ordinal del nodo, lo que equivale a anteponer a este número la expresiónposition()=
{} Si se usa dentro de una etiqueta en otro idioma (como HTML), el procesador XSLT trata el contenido de las llaves como un XPath.
/ Define el nivel del árbol, es decir, separa los pasos de direccionamiento
| Fusiona el resultado. Es decir, dentro de una ruta, puede escribir varias rutas de análisis a través del signo |, y el resultado de dicha expresión incluirá todo lo que se encuentre en cualquiera de estas rutas.

Enlaces