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.
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:
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.
Los ejes son la base del lenguaje XPath. Hay abreviaturas para algunos ejes.
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
Las funciones se dividen en 5 grupos:
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 |
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. |
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 |
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. |
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:
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. |
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.
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. |
Idiomas de consulta | |
---|---|
XSL | |
---|---|
Consorcio World Wide Web (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Productos y estándares |
| ||||||||||||||
Organizaciones |
| ||||||||||||||
EN |
| ||||||||||||||
Conferencias |
|