Consultas XPath: Ejemplos Prácticos y Explicaciones Detalladas

Consultas XPath: Ejemplos Prácticos

Este documento presenta una serie de ejemplos prácticos de consultas XPath, cubriendo una variedad de funciones y operadores. Cada ejemplo incluye una breve descripción y el código XPath correspondiente.

Selección Básica

  1. Mostrar los títulos de los libros con la etiqueta «titulo»:

    for $titulo in /bookstore/book/title/text()
    return <titulo>{$titulo}</titulo>

Filtrado de Resultados

  1. Mostrar los libros cuyo precio sea menor o igual a 30 (dos formas):

    Forma 1 (usando where):

    for $libro in doc("books.xml")/bookstore/book
    where $libro/price <= 30
    return $libro

    Forma 2 (usando XPath directo):

    for $libro in /bookstore/book[price<=30]
    return $libro
  2. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30 (dos formas):

    Forma 1 (usando where):

    for $libro in /bookstore/book
    where $libro/price <= 30
    return $libro/title

    Forma 2 (usando XPath directo):

    for $libro in /bookstore/book[price<=30]
    return $libro/title
  3. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual a 30:

    for $libro in /bookstore/book[price<=30]
    return <title>{$libro/title/text()}</title>

Selección con Condiciones Específicas

  1. Mostrar el título y el autor de los libros del año 2005, y etiquetar cada uno de ellos con «lib2005»:

    for $libro in /bookstore/book
    where $libro/year=2005
    return <lib2005>{$libro/title}{$libro/author}</lib2005>
    for $libro in /bookstore/book
    where $libro/year=2005
    return <lib2005>{$libro/title}{$libro/author}</lib2005>

Uso de for y let

  1. Mostrar los años de publicación (dos formas, para ilustrar la diferencia entre for y let). Etiquetar la salida con «publicacion»:

    Con for:

    for $year in /bookstore/book/year
    return <publicacion>{$year}</publicacion>

    Con let:

    let $year := /bookstore/book/year
    return <publicacion>{$year}</publicacion>

    Nota: Con for, se itera sobre cada año individualmente. Con let, se asigna toda la secuencia de años a la variable $year.

Ordenación de Resultados

  1. Mostrar los libros ordenados primero por «category» y luego por «title» en una sola consulta:

    for $libro in /bookstore/book
    order by $libro/@category,$libro/title
    return $libro

    Nota: @ se utiliza para acceder a los atributos de un elemento.

Funciones de Agregación

  1. Mostrar cuántos libros hay, y etiquetarlo con «total» (dos formas):

    Forma 1 (usando let):

    let $num_libro := count(/bookstore/book)
    return <total>{$num_libro}</total>

    Forma 2 (usando for – menos eficiente):

    for $x in doc("books.xml")/bookstore/book
    return <total>{count(/bookstore/book)}</total>
  2. Mostrar los títulos de los libros y al final una etiqueta con el número total de libros:

    let $total := count (/bookstore/book),
        $titulos := (
          for $libro in /bookstore/book/title
          return <titulo>{$libro/text()}</titulo>)
    return
          <resultado>
            {$titulos}
            <total_libros>{$total}</total_libros>
          </resultado>
  3. Mostrar el precio mínimo y máximo de los libros:

    let $max := max(/bookstore/book/price),
        $min := min(/bookstore/book/price)
    return
    <resultado>
      <max>{$max}</max>
      <min>{$min}</min>
    </resultado>
  4. Mostrar la suma total de los precios de los libros con la etiqueta «total»:

    let $libros := /bookstore/book
    return <total>{sum($libros/price)}</total>
  5. Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta con la suma de los precios:

    <libros>
    {
      for $libros in /bookstore/book
      return $libros/price
    }
    {
      let $libros := /bookstore/book
      return <total>{sum($libros/price)}</total>
    }
    </libros>

Cálculos y Formato de Salida

  1. Mostrar el título del libro, su precio y su precio con el IVA incluido (21%), cada uno con su propia etiqueta. Ordénalos por precio con IVA (dos formas):

    Forma 1 (con variable $precio_iva):

    for $libro in /bookstore/book
    let $precio_iva := ($libro/price * 1.21)
    order by $precio_iva
    return
    <libro>
      <titulo>{$libro/title/text()}</titulo>
      <precio>{$libro/price/text()} €</precio>
      <precio_iva>{$precio_iva} €</precio_iva>
    </libro>

    Forma 2 (calculando directamente en order by):

    for $libro in /bookstore/book
    order by $libro/price * 1.21
    return
    <libro>
      <titulo>{$libro/title/text()}</titulo>
      <precio>{$libro/price/text()} €</precio>
      <precio_iva>{$libro/price * 1.21} €</precio_iva>
    </libro>

Contando Elementos y Combinando Resultados

  1. Mostrar el título y el número de autores que tiene cada título en etiquetas diferentes:

    for $libros in /bookstore/book
    return
      <libro>
        {$libros/title}
        <autores>{count($libros/author)}</autores>
      </libro>
  2. Mostrar en la misma etiqueta el título y entre paréntesis el número de autores que tiene ese título:

    for $libros in /bookstore/book
    return <libro>{$libros/title/text()} ({count($libros/author)})</libro>

Funciones de Cadena

  1. Mostrar los libros escritos en años que terminen en «3» (dos formas):

    Forma 1 (usando where):

    for $libros in /bookstore/book
    where ends-with($libros/year, "3")
    return $libros

    Forma 2 (usando XPath directo):

    for $libros in /bookstore/book[ends-with(year, "3")]
    return $libros
  2. Mostrar los libros cuya categoría empiece por «C» (dos formas):

    Forma 1 (usando where):

    for $libros in /bookstore/book
    where starts-with($libros/@category, "C")
    return $libros

    Forma 2 (usando XPath directo):

    for $libros in /bookstore/book[starts-with(@category, "C")]
    return $libros
  3. Mostrar los libros que tengan una «X» (mayúscula o minúscula) en el título (dos formas, aunque la segunda forma es más correcta):

    Forma 1 (incorrecta, buscando «t»):

    for $libros in /bookstore/book
    where contains(lower-case($libros/title), "t")
    return $libros

    Forma 2 (correcta, buscando «x»):

    for $libros in /bookstore/book[contains(lower-case(title), "x")]
    return $libros
  4. Mostrar el título y el número de caracteres que tiene cada título, cada uno con su propia etiqueta:

    for $libros in /bookstore/book
    return
      <libro>
        {$libros/title}
        <length>{string-length($libros/title)}</length>
      </libro>

Funciones de Eliminación de Duplicados y Ordenación

  1. Mostrar todos los años en los que se ha publicado un libro eliminando los repetidos. Etiquétalos con «año»:

    for $años in distinct-values(/bookstore/book/year)
    return <año>{$años}</año>
  2. Mostrar todos los autores eliminando los que se repiten y ordenados por el número de caracteres que tiene cada autor:

    for $autores in distinct-values(/bookstore/book/author)
    order by string-length($autores)
    return <autor>{$autores}</autor>

Salida en formato HTML

  1. Mostrar los títulos en una tabla de HTML:
{$libros/title/text()}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *