XPath

  1. Dada la solución propuesta para almacenar la información sobre las facturas de una empresa, determinar la expresión XPath que selecciona:

    1. Las facturas que tenían algún descuento

      //factura[not(@descuento) or @descuento = 0]
      
    2. Las facturas anteriores al año en curso

      XPath 1.0: no hay función que devuelva en año en curso.

      //factura[substring(@fecha,1, 4) < 2023]
      

      XPath 2/3:

      //factura[fn:year-from-date(@fecha) < fn:current-date  => fn:year-from-date()]
      
    3. El número de facturas a las que se les aplicó un descuento mayor del 5%

      count(//factura[@descuento > 5])
      
    4. Las facturas con cinco productos diferentes.

      //factura[count(item) = 5]
      
    5. Las facturas en las que se facturó el producto «p01».

      //factura[item/@producto = "p01"]
      
    6. Los clientes que viven en Isla Cristina.

      //cliente[direccion/poblacion = "Isla Cristina"]
      
    7. Los clientes que viven en la provincia de Huelva (el código postal puede servir para ello).

      //cliente[substring(direccion/cp, 1, 2) = 21]
      
    8. Los nombres de los productos con iva superreducido.

      //producto[@iva = "superreducido"]/@nombre
      
    9. El número de productos que tienen un iva superreducido.

      count(//producto[@iva = "superreducido"])
      
    10. Todas las facturas en las que el número total de artículos comprados fuese de más de 10. Para que tenga sentido esta pregunta, hágase la suposición de que todos los productos que se venden, se venden por unidades.

      //factura[sum(item/@cantidad) > 10])
      
    11. El número de facturas emitidas en noviembre de 2012.

      count(//factura[substring(@fecha, 1, 7) = "2012-11"])
      
    12. El número de facturas que sólo contienen un producto.

      count(//factura[count(item) = 1])
      
    13. Los productos que se han vendido al menos una vez.

      //producto[@codigo = //item/@producto]
      
    14. Las facturas a nombre de Perico de los Palotes.

      //factura[@cliente = //cliente[nombre = "Perico de los Palotes"]/@id]
      
    15. Los productos de la factura con identificador «f01» cuyo iva es normal.

      //producto[@iva = "normal"][@codigo = //factura[@codigo = "f01"]/item/@producto]
      
    16. Todas las facturas en las que se facturaron altramuces.

      //factura[item/@producto = //producto[@nombre = "altramuces"]/@codigo]
      
    17. El total de sandías vendidas.

      sum(//factura/item[@producto = //producto[@nombre = "sandía"]/@codigo]/@cantidad)
      
    18. Las facturas emitidas a residentes en Isla Cristina.

      //factura[@cliente = //cliente[direccion/poblacion = "Isla Cristina"]/@id]
      
    19. Las facturas sin productos gravados con iva normal.

      //factura[not(item[@producto = //producto[@iva = "normal"]/@codigo])]
      
    20. Las facturas cuyos productos están todos gravados con iva normal.

      //factura[not(item[@producto != //producto[@iva = "normal"]/@codigo])]
      
    21. [XPath 2/3] El importe total de la primera factura sin tener en cuenta el descuento.

      sum(//factura[1]/item/(@precio * @cantidad))
      
    22. [XPath 2/3] El importe total de cada factura sin tener en cuenta el descuento.

      //factura/sum(item/(@precio * @cantidad))
      
    23. [XPath 2/3] El importe total de cada factura.

      //factura/((1 - (if (@descuento) then @descuento else 0) div 100)*sum(item/(@precio * @cantidad)))
      
  2. Dada la solución propuesta para almacenar la información sobre los libros y préstamos en una biblioteca, determinar la expresión XPath que devuelve:

    1. El número de socios de la biblioteca

      count(//lector)
      
    2. La dirección del socio que se llama Perico de los Palotes.

      //lector[nombre="Perico de los Palotes"]/direccion
      
    3. Los libros cuyo año de edición sea 1985.

      //libro[año=1985]
      
    4. Los libros de la editorial Alfaguara.

      //libro[editorial="Alfaguara"]
      
    5. El número total de ejemplares que hay en la biblioteca.

      count(//ejemplar)
      
    6. Todos los libros cuyo autor sea «Miguel de Cervantes Saavedra».

      //libro[autor="Miguel de Cervantes Saavedra"]
      
    7. El número de ejemplares del libro con ISBN 00-9081-234.

      count(//libro[isbn="00-9081-234"]//ejemplar)
      
    8. El número total de ejemplares actualmente en préstamo.

      count(//prestamo[not(@entrega)])
      
    9. El número total de ejemplares que no se encuentran prestados.

      count(//ejemplar) - count(//prestamo[not(@entrega)])
      
    10. Los libros que se han prestado al socio l01.

      count(//ejemplar) - count(//prestamo[not(@entrega)])
      
    11. La cantidad de ejemplares de libros de la editorial Castalia.

      count(//libro[editorial="Castalia"]//ejemplar)
      
    12. Los identificadores de los socios que tienen algún libro en préstamo.

      //lector[@registro = //prestamo[not(@entrega)]/@lector]/@registro
      

      Pero si usamos XPath 2/3 podemos hacer:

      fn:distinct-values(//prestamo[not(@entrega)]/@lector)
      
    13. Los libros que no están prestados al socio l01.

      //libro[not(.//@codigo = //prestamo[not(@entrega)][@lector = "l01"]/@ejemplar)]
      
    14. Los libros que se han prestado al socio l01, pero no al socio l02.

      //libro[.//@codigo = //prestamo[@lector = "l01"]/@ejemplar][not(.//@codigo = //prestamo[@lector = "l02"]/@ejemplar)]
      
    15. Los ejemplares aún disponibles (no prestados) de Don Quijote de La Mancha.

      //libro[nombre="Don Quijote de la Mancha"]//ejemplar[not(@codigo = //prestamo[not(@entrega)]/@ejemplar)]
      
    16. Los libros de los que quedan menos de dos ejemplares disponibles en la biblioteca.

      //libro[count(.//ejemplar[not(@codigo = //prestamo[not(@entrega)]/@ejemplar)]) < 2]
      
    17. Los libros de los que no se ha prestado nunca ningún ejemplar.

      //libro[not(.//ejemplar/@codigo = //prestamo/@ejemplar))]
      
    18. El número de ejemplares prestados al socio Perico de los Palotes.

      count(//prestamo[not(@entrega)][@lector = //lector[nombre="Perico de los Palotes"]/@registro])
      
    19. Los libros que tienen todos los ejemplares prestados

      //libro[count(.//ejemplar) = count(.//ejemplar[@codigo = //prestamo[not(@entrega)]/@ejemplar])]
      
    20. Los libros que tienen más ejemplares prestados que en la biblioteca.

      //libro[2*count(.//ejemplar[@codigo = //prestamo[not(@entrega)]/@ejemplar]) > count(.//ejemplar)]
      
  3. Dada la solución propuesta para almacenar la información sobre los coches que vende un concesionario, determinar la expresión XPath que devuelve:

    1. La marca de coches que vende el concesionario.

      /concesionario/@marca
      
    2. El nombre de los modelos que vende el concesionario.

      //modelo/@nombre
      
    3. Los modelos de cinco plazas.

      //modelo[plazas=5]
      
    4. Los modelos que tienen una cilindrada mayor a 300.

      //modelo[cilindrada>300]
      
    5. El modelo León.

      //modelo[@nombre="León"]
      
    6. El último modelo del archivo

      //modelo[last()]
      
    7. El número de modelos que vende el concesionario.

      count(//modelo)
      
    8. El número de modelos que no son de cinco plazas

      count(//modelo[plazas!=5])
      
    9. El cliente de identificador c01.

      //cliente[@id='p01']
      
    10. El número de clientes.

      count(//cliente)
      
    11. Los coches que ha reservado el cliente c01

      //coche[@reservado="c01"]
      
    12. Los coches nuevos

      //coche[@tipo="nuevo"]
      
    13. Los coches reservados.

      //coche[@reservado]
      
    14. El número de coches León.

      count(//coche[@modelo = //modelo[@nombre="León"]/@id])
      
    15. Los ibizas reservados

      //coche[@modelo = //modelo[@nombre="Ibiza"]/@id][@reservado]
      
    16. Los coches de segunda mano reservados.

      //coche[@tipo="2mano"][@reservado]
      
    17. Los coches reservados que sean ibiza o león

      //coche[@modelo = //modelo[@nombre="León" or @nombre="Ibiza"]/@id][@reservado]
      
    18. Los coches nuevos no reservados aún.

      //coche[@tipo="nuevo"][not(@reservado)]
      
    19. El número de coches del modelo León

      count(//coche[@modelo = //modelo[@nombre="León"]/@id])
      
    20. Los coches reservados a los habitantes de Villabajo.

      //coche[@reservado = //cliente[.//poblacion="Villaabajo"]/@id]
      
  4. Dada la solución propuesta para almacenar la información sobre los parques nacionales, determinar la expresión XPath que devuelve:

    1. El número de especies vegetales.

      count(//especie[@tipo = "flora"])
      
    2. Las especies vegetales con un peligro alto de extinción.

      //especie[@tipo = "flora"][@peligro = "alto"]
      
    3. El número de especies animales en peligro bajo de extinción.

      //especie[@tipo = "fauna"][@peligro = "bajo"]
      
    4. El número de especies en peligro alto de extinción.

      count(//especie[@peligro = "alto"])
      
    5. El nombre común de las especies vegetales en peligro alto de extinción

      //especie[@tipo = "flora"][@peligro = "alto"]/comun
      
    6. El peligro de extinción del animal de nombre común «Lince ibérico».

      //especie[comun = "Lince ibérico"]/@peligro
      
    7. El número de parques nacionales.

      count(//parque)
      
    8. El número de parques en Canarias.

      count(//parque[@ca = "Canarias"])
      
    9. Los parques de la provincia de Huelva.

      count(//parque[@provincia = "Huelva"])
      
    10. Los parques con una extensión mayor de 30.000 hectáreas.

      //parque[@extension > 30000]
      
    11. El total de presupuestos.

      sum(//parque/@presupuesto)
      
    12. El parque de Timanfaya.

      //parque[@nombre = "Timanfaya"]
      
    13. El total de ejemplares de Lince ibérico que hay en los parques.

      sum(//parque/especimen[@ref = //especie[comun = "Lince ibérico"]/@id]/@ejemplares)
      
    14. El número de especies de interés en Doñana.

      count(//parque[@nombre = "Doñana"]/especimen)
      
    15. El número de ejemplares animales de interés en Doñana.

      sum(//parque[@nombre = "Doñana"]/especimen[@ref = //especie[@tipo = "fauna"]/@id]/@ejemplares)
      
    16. Las especies animales de interés del parque de Garajonay.

      //especie[@tipo = "fauna"][@id = //parque[@nombre = "Garajonay"]/especimen/@ref]
      
    17. Las comunidades autónomas con parques nacionales.

      //parque/@ca
      
    18. Los parques nacionales con menos de veinte especies de interés

      //parque/[count(especimen) < 20]
      
    19. El número de parques nacionales que sólo tiene como especies de interés animales.

      count(//parque[not(especimen[@ref = //especie[@tipo = "flora"]/@id])])
      
    20. Los parques donde hay más especies animales de interés que vegetales

      //parque[count(especimen[@ref = //especie[@tipo = "fauna"]/@id]) > count(especimen[@ref = //especie[@tipo = "flora"]/@id])]
      
  5. Dada la solución propuesta para almacenar la información sobre los habitantes de un municipio, determinar la expresión XPath que devuelve:

    1. El número de habitantes del municipio.

      count(//persona)
      
    2. Los varones del municipio.

      //persona[@sexo="hombre"]
      
    3. Las mujeres del municipio.

      //persona[@sexo="mujer"]
      
    4. El número de habitantes de los que se tiene registrado el padre.

      //persona[@padre]
      
    5. El número de habitantes de los que se tienen registrados padre y madre.

      //persona[@padre][@madre]
      
    6. El número de habitantes de los que no se tienen registrados padre ni madre.

      //persona[not(@padre)][not(@madre)]
      
    7. Los nombres de los habitantes de los que se tiene registrada la madre, pero no el padre.

      //persona[not(@padre)][@madre]/nombre
      
    8. Los varones cazorleños de los que se tiene registrado el padre.

      //persona[@sexo = "hombre"][@padre][origen = "Cazorla"]
      
    9. Los habitantes que se llaman Perico.

      //persona[nombre = "Perico"]
      
    10. El listado de identificadores de personas que son padre.

      //persona/@padre
      
    11. El listado de identificadores de personas que son madre.

      //persona/@madre
      
    12. Los habitantes de padre registrado que han nacido en Cazorla.

      //persona[@padre][origen = "Cazorla"]
      
    13. Los datos de los habitantes cuyo padre tienen identificador p01.

      //persona[@padre = "p01"]
      
    14. Los habitantes que son padre de alguien.

      //persona[@id = //persona/@padre]
      
    15. Las habitantes que son madre de alguien.

      //persona[@id = //persona/@madre]
      
    16. Los habitantes que son padre de alguien y, a la vez, tienen padre registrado.

      //persona[@id = //persona/@padre][@padre]
      
    17. ¿Hay alguna persona que haya nacido en Villaconejos.

      boolean(//persona[origen = "Villaconejos"])
      
    18. El listado de localidades en las que hayan nacido los habitantes que son padre.

      //persona[@id = //persona/@padre]/origen
      

      Nota

      En XPath 2/3 podríamos aññadir fn:distinct-values() para evitar las repeticiones.

    19. Los varones que no son padre.

      //persona[not(@id = //persona/@padre)][@sexo = "hombre"]
      
    20. Las mujeres que no son madre de ninguna niña.

      //persona[not(@id = //persona[@sexo = "mujer"]/@madre)][@sexo = "mujer"]
      
  6. Dada la solución propuesta para almacenar la información de un dibujo técnico en dos dimensiones, determinar la expresión XPath que selecciona:

    1. Todas las circunferencias.

      //circunferencia
      
    2. La cuarta recta.

      //recta[4]
      
    3. Los centros de las circunferencias.

      //circunferencia/@x | //cicunferencia/@y
      
    4. El último punto.

      //punto[last()]
      
    5. El rectángulo con identificador «e32».

      //rectangulo[@id = 'e32']
      
    6. Todos los radios de las circunferencias.

      //circunferencia/@r
      
    7. El radio de la circunferencia de identificador «e2».

      //circunferencia[@id = 'e32']/@r
      
    8. El radio de la quinta circunferencia.

      //circunferencia[5]/@r
      
    9. Todos los radios de circunferencia mayores de 10.

      //circunferencia/@r[. > 10]
      
    10. Las unidades en las que se han expresado todos los números.

      /grafico/@unidad
      
    11. El identificador de la quinta entidad de dibujo.

      /grafico/*[5]/@id
      
    12. Las rectas cuyo punto inicial sea el centro de coordenadas (0,0).

      //recta[@x1 = 0][@y1 = 0]
      
    13. Las rectas cuyo punto inicial esté en el segundo cuadrante.

      //recta[@x1 < 0][@y1 > 0]
      
    14. Los puntos que se encuentren en el cuarto cuadrante.

      //recta[@x > 0][@y < 0]
      
    15. El cuarto de los rectángulos

      //rectangulo[4]
      
    16. Todas las coordenadas y de todas las rectas.

      //recta/@y
      
    17. Todas las coordenadas y de todas las entidades de dibujo.

      /grafico/*/@y
      
    18. Los puntos finales de todos los rectángulos.

      //rectangulo/@x2 | //rectangulo/@y2
      
    19. Todas las rectas cuya coordenada x del punto inicial sea mayor que la coordenada x del punto final.

      //recta[@x1 > @x2]
      
    20. ¿Cuántos puntos hay en total?

      count(//punto)
      
    21. ¿Cuántos puntos hay en el primer cuadrante?

      count(//punto[@x > 0][@y >  0])
      
    22. ¿Cuántas circunferencias tienen radio mayor de 20?

      count(//circunferencia[@r > 20])
      
    23. ¿Cuántas entidades de dibujo hay en total?

      count(/grafico/*)
      
    24. ¿Cuántas coordenadas x hay definidas en total?

      count(/grafico/*/@x | /grafico/*/@x1 | /grafico/*/@x2)
      
    25. Todos los rectángulos cuyo lado horizontal sea el doble de largo que el vertical.

      //rectangulo[(@x2-@x1)*(@x2-@x1) = 4(@y2-@y1)*(@y2-@y1)]