FreeToGenerate.com

Se ejecuta en el motor XPath de tu propio navegador y te dice qué va a rechazar. No se sube nada.

Expresión y documento

Se analiza como XML. Vale cualquier cosa bien formada: pega un fragmento del documento que estés consultando de verdad.

Resultados

Evaluando en tu navegador…

Qué usa esta expresión

  • ends-with()funciónañadida después de XPath 1.0: no disponible

Qué escribir en su lugar

Hay un equivalente exacto en XPath 1.0. Una cadena termina en un sufijo cuando la subcadena que empieza a esa distancia del final es igual a él, teniendo en cuenta que XPath cuenta desde 1, que es justo donde una versión escrita a mano suele fallar por uno.

Reescrito para XPath 1.0

substring(@href, string-length(@href) - string-length('.pdf') + 1) = '.pdf'

Qué hace tu navegador realmente

namespace::Comprobando…

El eje namespace forma parte de XPath 1.0 y aun así es la pieza en la que los navegadores han diferido históricamente, así que conviene comprobarlo en vez de darlo por hecho. Esto se ejecuta en tu propio navegador y cuenta lo que encuentra, y por eso la respuesta de arriba puede no coincidir con la que ve otra persona.

Los navegadores solo hablan XPath 1.0

La versión de XPath que llevan dentro los navegadores es la de 1999. Define una biblioteca básica de veintisiete funciones y trece ejes, y eso es todo: lo que añadieron XPath 2.0 y posteriores solo existe en herramientas que ejecutas fuera del navegador, como un procesador XSLT 2.0 o una biblioteca que trae su propio motor.

La carencia tiene una forma incómoda más que ordenada. starts-with() está. contains() está. ends-with() no, porque llegó con XPath 2.0, así que la manera más natural de seleccionar enlaces a PDF es precisamente la que no existe, y el error que lanza el navegador no explica por qué. Lo mismo pasa con toda la familia de expresiones regulares, con cambiar mayúsculas y minúsculas, y con mínimo y máximo.

Las listas de funciones y ejes vienen de la recomendación XPath 1.0; las funciones posteriores se comprueban contra XPath and XQuery Functions and Operators 3.1. No se sube nada: la evaluación ocurre en esta pestaña.

También disponible en: English · Português · Français · العربية

Probador de XPath

Evalúa una expresión XPath sobre tu XML y comprueba qué funciones admiten realmente los navegadores, y qué escribir en su lugar.

Qué es un probador de XPath

XPath es el lenguaje para señalar partes de un documento XML: una ruta como //a[@class='external'] selecciona todos los enlaces con esa clase, estén donde estén en el árbol. Es lo que usan las bibliotecas de scraping, las hojas XSLT, las herramientas de automatización de navegadores y bastantes formatos de configuración cuando necesitan decir a qué elemento se refieren.

Un probador de XPath te deja escribir una expresión, ejecutarla contra un documento que tú aportas y ver qué devuelve antes de llevarla al código. Importa porque XPath falla en silencio en las dos direcciones: una expresión que no selecciona nada se parece mucho a una expresión equivocada, y una que da error te habla de sintaxis cuando el problema real es que la función que has usado no existe.

Este ejecuta la expresión en el motor XPath de tu propio navegador, que es el mismo que usarían los scripts de tu página. Además lee la expresión y te dice qué funciones y ejes están disponibles ahí, que es la parte que casi todos los probadores te dejan descubrir por las malas.

Cómo se usa

  1. Escribe tu expresión. Desde una ruta simple hasta una cargada de predicados. El análisis de abajo se actualiza mientras escribes, antes incluso de ejecutarla.
  2. Pega el XML donde buscar. Lo mejor es un fragmento del documento real. Se analiza como XML, así que tiene que estar bien formado: una etiqueta sin cerrar se informa como error de análisis en vez de ignorarse en silencio.
  3. Lee los dos paneles. Los resultados son lo que ha devuelto el motor de tu navegador. Debajo, cada función y cada eje de tu expresión aparecen como disponibles o no, con el reemplazo de XPath 1.0 cuando existe.

Los navegadores solo hablan XPath 1.0

El XPath que llevan dentro los navegadores es el de 1999, y nada posterior. Esa especificación define una biblioteca básica de exactamente veintisiete funciones y exactamente trece ejes: ese es todo el lenguaje desde el punto de vista de un navegador. XPath 2.0 y 3.1 añadieron muchísimo, y nada de eso está disponible aquí; vive en procesadores XSLT 2.0 y en bibliotecas que traen su propio motor.

La carencia no tiene la forma ordenada que esperarías. starts-with() está entre las veintisiete. contains() está entre las veintisiete. ends-with() no, porque llegó con XPath 2.0, lo que significa que la manera más natural de seleccionar enlaces a archivos PDF es precisamente la forma que no puede ejecutarse, y el error que lanza el navegador habla de la expresión y no de la versión. Esa asimetría pilla a mucha gente, y es la razón de que exista esta página en vez de ser otra caja que ejecuta consultas.

Y pasa lo mismo en todos los frentes. No hay ningún soporte de expresiones regulares: matches(), replace() y tokenize() son añadidos posteriores, y no puedes construirlos con lo que queda. No hay lower-case() ni upper-case(). No hay min(), max(), avg() ni abs(). No son rincones oscuros: son las funciones a las que la gente recurre primero.

Algunas tienen sustitutos honestos en XPath 1.0 y otras no, y saber cuál es cuál te ahorra una tarde. ends-with() se reescribe exacto, con substring() y string-length() y recordando que XPath cuenta los caracteres desde uno y no desde cero. Cambiar mayúsculas y minúsculas se aproxima con translate() si deletreas los dos alfabetos, lo que funciona para ASCII y nada más. Las expresiones regulares no tienen equivalente alguno y tienen que salir de la consulta al código que la rodea.

Limitaciones honestas

Tu documento se analiza como XML, no como HTML. Es lo más estricto de los dos, y es deliberado: XPath está definido sobre un árbol XML, y analizar con manga ancha te dejaría escribir aquí expresiones que se comportan de otro modo contra un documento real. La consecuencia práctica es que un fragmento de HTML del mundo real con una etiqueta sin cerrar será rechazado, y tendrás que arreglarlo antes.

Los espacios de nombres son el filo más afilado de XPath y esta página no lo suaviza. Si tu documento declara un espacio de nombres por defecto, un simple //title no seleccionará nada, porque en XPath 1.0 un nombre sin prefijo significa sin espacio de nombres y no el espacio por defecto. No hay forma de sortearlo dentro del propio lenguaje: necesitas o un resolutor de espacios de nombres, que es una función y por tanto no se puede escribir en una caja de texto, o el rodeo con local-name().

La comprobación que hace esta página sobre tu expresión la lee en vez de ejecutarla, así que identifica funciones y ejes por su nombre. Una expresión puede pasar esa comprobación y seguir estando mal por motivos que ningún análisis detecta: un argumento del tipo equivocado, o un predicado que significa algo distinto de lo que pretendías. El panel de resultados es la respuesta; el análisis está para explicar un fallo que el navegador describe mal.

Hay algo que se informa a propósito en vez de darse por supuesto: el eje namespace forma parte de XPath 1.0 y aun así ha sido la pieza en la que los navegadores han diferido. En lugar de decirte qué hace el tuyo, la página ejecuta la comprobación en tu navegador y cuenta lo que encuentra, y por eso esa línea puede no coincidir con la que ve otra persona.

¿Por qué es gratis?

El motor es el que ya lleva tu navegador, así que no hay nada que ejecutar ni nada que pagar. Evaluar una expresión XPath no cuesta más que cualquier otro trozo de script de la página.

Nada de lo que pegas se sube, se guarda ni se registra. El XML que estás depurando suele ser un fragmento de datos reales de alguien, y la forma fiable de mantener eso en privado es no recibirlo nunca.