Consultas XPath: ejercicios prácticos con soluciones para XML

Clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 7,05 KB
Actualizado el

Resumen

El documento propone 19 ejercicios prácticos de consultas XPath sobre estructuras XML, como conteo de nodos, selección de hijos, descendientes, ancestros y atributos. Cada ejercicio incluye su solución en expresión XPath, y algunos añaden un ejemplo de uso real. Al final se incluye una definición de tipo de documento (DTD) de un formulario HTML.

Puntos clave

  • count(//alfa) cuenta todos los nodos alfa del documento, sin importar su nivel.
  • /raíz/*[1] selecciona el primer hijo del nodo raíz y /raíz/*[last()] el último.
  • //@attr1 devuelve los valores de todos los atributos attr1 del documento.
  • //*[@attr2>5]/.. obtiene el padre de los elementos con attr2 numérico mayor que 5.
  • count(//gamma/alfa | //gamma/beta) cuenta el total de alfa o beta hijos de gamma sin duplicados.
  • count(//*[count(*)=0]) cuenta los elementos hoja, es decir, los que no tienen hijos.
  • La DTD del final define la estructura de un formulario con elementos html, head, body, form, input, select y textarea.

Resumen generado con IA a partir del documento. Ponte a prueba

Introducción a las Consultas XPath

Este documento presenta una serie de ejercicios prácticos diseñados para afianzar el conocimiento y la aplicación de expresiones XPath en la manipulación y consulta de estructuras de documentos XML. Cada ejercicio plantea un problema específico de selección o conteo de nodos y atributos, seguido de su correspondiente solución en XPath, y se complementa con un ejemplo de utilidad para contextualizar su aplicación en escenarios reales.

Ejercicios Propuestos de XPath

  1. Ejercicio 01: Conteo de Nodos por Tipo

    Contar la ocurrencia de cada tipo de nodo: alfa, beta, gamma, delta, épsilon y theta.

  2. Ejercicio 02: Nodos Hijos Directos del Raíz

    Determinar el número de nodos alfa, beta, gamma, delta, épsilon y theta que son hijos directos del elemento raíz.

  3. Ejercicio 03: Nodos Descendientes de un Elemento Delta

    Contar el número de nodos alfa, beta, gamma, épsilon y theta que son descendientes de un elemento delta.

  4. Ejercicio 04: Mostrar Valores de Atributos Específicos

    Mostrar el valor de todos los atributos attr1 presentes en el documento.

  5. Ejercicio 05: Primer Hijo del Nodo Raíz

    Identificar y mostrar el primer hijo del nodo raíz.

  6. Ejercicio 06: Último Hijo del Nodo Raíz

    Identificar y mostrar el último hijo del nodo raíz.

  7. Ejercicio 07: Penúltimo Hijo del Nodo Raíz

    Identificar y mostrar el penúltimo hijo del nodo raíz.

  8. Ejercicio 08: Hijos del Nodo Raíz a partir del Segundo

    Mostrar todos los hijos del nodo raíz, excluyendo el primero.

  9. Ejercicio 09: Elemento Padre por Atributo Condicional

    Mostrar el nombre del elemento padre de cualquier nodo que posea un atributo attr2 con un valor numérico superior a 5.

    Ejemplo de utilidad: Localizar la biblioteca que contiene un libro con un ISBN específico.

  10. Ejercicio 10: Elemento por Contenido Textual

    Mostrar el nombre del elemento cuyo contenido textual exacto sea "Contenido 3".

    Ejemplo de utilidad: Seleccionar un libro específico por su título.

  11. Ejercicio 11: Conteo Condicional de Nodos Hijos

    Contar el número de elementos gamma que son hijos directos de un elemento delta que, a su vez, posee el atributo attr2.

    Ejemplo de utilidad: Listar los títulos de todos los libros con un precio superior a 10 euros.

  12. Ejercicio 12: Conteo Total de Atributos en Hijos del Raíz

    Contar el número total de atributos presentes en todos los hijos directos del elemento raíz.

  13. Ejercicio 13: Conteo de Hijos Directos del Raíz

    Contar el número de hijos directos que tiene el elemento raíz.

  14. Ejercicio 14: Conteo de Elementos Hoja

    Contar el número de elementos hoja (aquellos sin hijos) en el documento.

  15. Ejercicio 15: Conteo de Elementos con Atributos

    Contar el número de elementos que poseen al menos un atributo.

  16. Ejercicio 16: Conteo de Nodos Alfa o Beta Hijos de Gamma

    Contar el número total de elementos alfa o beta que son hijos directos de un elemento gamma. (La cuenta debe ser total, no la suma de conteos individuales).

  17. Ejercicio 17: Conteo de Ancestros por Contenido

    Contar el número de ancestros del elemento que contiene el texto "Contenido 1".

  18. Ejercicio 18: Conteo de Descendientes del Penúltimo Hijo

    Contar el número de descendientes del penúltimo hijo del nodo raíz.

  19. Ejercicio 19: Conteo de Hermanos del Segundo Hijo

    Contar el número de hermanos (elementos del mismo nivel) del segundo hijo del nodo raíz.

Soluciones XPath Detalladas

  1. Solución 01

    count(//alfa)
    count(//beta)
    count(//gamma)
    count(//delta)
    count(//épsilon)
    count(//theta)
  2. Solución 02

    count(/raíz/alfa)
    count(/raíz/beta)
    count(/raíz/gamma)
    count(/raíz/delta)
    count(/raíz/épsilon)
    count(/raíz/theta)
  3. Solución 03

    count(//delta//alfa)
    count(//delta//beta)
    count(//delta//gamma)
    count(//delta//épsilon)
    count(//delta//theta)
  4. Solución 04

    //@attr1
  5. Solución 05

    /raíz/*[1]
  6. Solución 06

    /raíz/*[last()]
  7. Solución 07

    /raíz/*[last()-1]
  8. Solución 08

    /raíz/*[position()>1]
  9. Solución 09

    //*[@attr2>5]/..
  10. Solución 10

    //*[text()="Contenido 3"]
  11. Solución 11

    count(//delta[@attr2]/gamma)
  12. Solución 12

    count(/raíz/*/attribute::*)
  13. Solución 13

    count(/raíz/*)
  14. Solución 14

    count(//*[count(*)=0])
  15. Solución 15

    count(//*[@*])
  16. Solución 16

    count(//gamma/alfa | //gamma/beta)
  17. Solución 17

    count(//*[text()='Contenido 1']/ancestor::*)
  18. Solución 18

    count(/raíz/*[last()-1]/descendant::*)
  19. Solución 19

    count(/raíz/*[2]/preceding-sibling::* | /raíz/*[2]/following-sibling::*)

Definición de Tipo de Documento (DTD)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html [
	<!ELEMENT html (head, body)>
	<!ELEMENT head (title)>
		<!ELEMENT title (#PCDATA)>
	<!ELEMENT body (form)>
		<!ELEMENT form (#PCDATA | input | fieldset | select | textarea)*>
			<!ATTLIST form 
				action CDATA #IMPLIED
				method (get | post | set) "get" 
			>
			<!ELEMENT input (#PCDATA)>
				<!ATTLIST input 
					type (text|submit|password|reset|radio|checkbox|button|color|
						date|time|url|email|file|number|range) #REQUIRED 
					name CDATA #IMPLIED
					value CDATA #IMPLIED
					min CDATA #IMPLIED
					max CDATA #IMPLIED
					onclick CDATA #IMPLIED
				>
			<!ELEMENT select (option+)>
				<!ATTLIST select name CDATA #IMPLIED>	
				 <!ELEMENT option (#PCDATA)>
					<!ATTLIST option value CDATA #IMPLIED>
			
			<!ELEMENT fieldset (#PCDATA | legend | select | input | textarea | fieldset)*>
				<!ELEMENT legend (#PCDATA)>
			<!ELEMENT textarea (#PCDATA)>
				<!ATTLIST textarea
					name CDATA #IMPLIED
					rows CDATA #IMPLIED
					cols CDATA #IMPLIED 
				>				
]>

Preguntas frecuentes

¿Cómo se selecciona el último hijo del nodo raíz en XPath?

Se usa la expresión /raíz/*[last()], que devuelve el último elemento hijo directo del nodo raíz. Para el penúltimo se emplea /raíz/*[last()-1].

¿Qué devuelve la expresión //@attr1?

Devuelve los valores de todos los atributos llamados attr1 presentes en el documento, sin importar en qué elemento aparezcan.

¿Cómo se cuentan los elementos hoja de un documento XML?

Con la expresión count(//*[count(*)=0]), que cuenta los elementos que no tienen ningún hijo.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué expresión XPath selecciona el primer hijo del nodo raíz?
2. ¿Qué devuelve la expresión //@attr1?
3. ¿Qué cuenta la expresión count(//*[count(*)=0])?
4. ¿Por qué la solución del ejercicio 16 usa el operador | ?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.