Saltar al contenido

Solución paso a paso del examen de HTML, CSS, XML y XQuery

En este post vamos a resolver, uno a uno, los cuatro ejercicios del examen: generación de formularios y menús con HTML/CSS, definición y validación de datos con XSD/DTD y extracción de información con XQuery. Incluimos todo el código listo para copiar y pegar.

Ejercicio 1: Formulario HTML

Generamos un formulario que incluye:

  • Nombre y apellidos (texto).
  • Sexo (radio botones, obligatorio).
  • Fecha de nacimiento.
  • Dirección (obligatoria) y teléfonos: fijo (obligatorio) y móvil (opcional).
  • Checkbox de aficiones (varias opciones).
  • Desplegable (<select>).
  • Área de texto para comentarios.

&lt;form action="procesar.php" method="post"&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;Datos personales&lt;/legend&gt;

    &lt;label for="nombre"&gt;Nombre y Apellidos:&lt;/label&gt;
    &lt;input type="text" id="nombre" name="nombre_apellidos" required /&gt;

    &lt;p&gt;Sexo:&lt;/p&gt;
    &lt;label&gt;
      &lt;input type="radio" name="sexo" value="Hombre" required /&gt; Hombre
    &lt;/label&gt;
    &lt;label&gt;
      &lt;input type="radio" name="sexo" value="Mujer" required /&gt; Mujer
    &lt;/label&gt;

    &lt;label for="nacimiento"&gt;Fecha de nacimiento:&lt;/label&gt;
    &lt;input type="date" id="nacimiento" name="fecha_nacimiento" 
           min="1975-01-01" max="2005-12-31" /&gt;

    &lt;label for="direccion"&gt;Dirección:&lt;/label&gt;
    &lt;input type="text" id="direccion" name="direccion" required /&gt;

    &lt;label for="telefono_fijo"&gt;Teléfono fijo:&lt;/label&gt;
    &lt;input type="tel" id="telefono_fijo" name="telefono_fijo" 
           pattern="[0-9]{5,15}" required /&gt;

    &lt;label for="telefono_movil"&gt;Teléfono móvil:&lt;/label&gt;
    &lt;input type="tel" id="telefono_movil" name="telefono_movil" 
           pattern="[0-9]{5,15}" /&gt;

    &lt;fieldset&gt;
      &lt;legend&gt;Aficiones&lt;/legend&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="aficiones[]" value="Deporte" /&gt; Deporte
      &lt;/label&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="aficiones[]" value="Música" /&gt; Música
      &lt;/label&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="aficiones[]" value="Lectura" /&gt; Lectura
      &lt;/label&gt;
      &lt;!-- … más opciones … --&gt;
    &lt;/fieldset&gt;

    &lt;label for="pais"&gt;País:&lt;/label&gt;
    &lt;select id="pais" name="pais"&gt;
      &lt;option value="" disabled selected&gt;-- Selecciona --&lt;/option&gt;
      &lt;option value="ES"&gt;España&lt;/option&gt;
      &lt;option value="MX"&gt;México&lt;/option&gt;
      &lt;option value="AR"&gt;Argentina&lt;/option&gt;
      &lt;!-- … más opciones … --&gt;
    &lt;/select&gt;

    &lt;label for="comentarios"&gt;Comentarios:&lt;/label&gt;
    &lt;textarea id="comentarios" name="comentarios" rows="4"&gt;&lt;/textarea&gt;

    &lt;button type="submit"&gt;Enviar&lt;/button&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;
  

Ejercicio 2: Menú desplegable con HTML/CSS

Construimos una lista anidada y con CSS desplegamos los submenús al pasar el ratón:

HTML


&lt;nav class="menu"&gt;
  &lt;ul&gt;
    &lt;li&gt;Item 1&lt;/li&gt;
    &lt;li&gt;
      Item 2
      &lt;ul class="submenu"&gt;
        &lt;li&gt;Folder 2.1
          &lt;ul class="submenu"&gt;
            &lt;li&gt;Sub item 2.1.1&lt;/li&gt;
            &lt;li&gt;Sub item 2.1.2&lt;/li&gt;
            &lt;li&gt;Sub item 2.1.3&lt;/li&gt;
            &lt;li&gt;Sub item 2.1.4&lt;/li&gt;
          &lt;/ul&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Item 3&lt;/li&gt;
    &lt;li&gt;Item 4&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
  

CSS


.menu ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
.menu li {
  position: relative;
  padding: 8px 12px;
  cursor: pointer;
}
.menu .submenu {
  display: none;
  position: absolute;
  top: 100
  left: 0;
}
.menu li:hover &gt; .submenu {
  display: block;
}
.menu .submenu li:hover &gt; .submenu {
  display: block;
  top: 0;
  left: 100
}
  

Ejercicio 3: XML Schema (XSD), ejemplo XML y DTD

1. Definición de .xsd


&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="personas"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="persona" maxOccurs="unbounded"&gt;
          &lt;xs:complexType&gt;
            &lt;xs:sequence&gt;
              &lt;xs:element name="nombre" type="xs:string"/&gt;
              &lt;xs:element name="apellidos" type="xs:string"/&gt;
              &lt;xs:element name="sexo"&gt;
                &lt;xs:simpleType&gt;
                  &lt;xs:restriction base="xs:string"&gt;
                    &lt;xs:enumeration value="Hombre"/&gt;
                    &lt;xs:enumeration value="Mujer"/&gt;
                  &lt;/xs:restriction&gt;
                &lt;/xs:simpleType&gt;
              &lt;/xs:element&gt;
              &lt;xs:element name="nacimiento" minOccurs="0"&gt;
                &lt;xs:complexType&gt;
                  &lt;xs:attribute name="dia"&gt;
                    &lt;xs:simpleType&gt;
                      &lt;xs:restriction base="xs:integer"&gt;
                        &lt;xs:minInclusive value="1"/&gt;
                        &lt;xs:maxInclusive value="31"/&gt;
                      &lt;/xs:restriction&gt;
                    &lt;/xs:simpleType&gt;
                  &lt;/xs:attribute&gt;
                  &lt;xs:attribute name="mes"&gt;
                    &lt;xs:simpleType&gt;
                      &lt;xs:restriction base="xs:string"&gt;
                        &lt;xs:enumeration value="enero"/&gt;
                        &lt;xs:enumeration value="febrero"/&gt;
                        &lt;!-- … resto meses … --&gt;
                      &lt;/xs:restriction&gt;
                    &lt;/xs:simpleType&gt;
                  &lt;/xs:attribute&gt;
                  &lt;xs:attribute name="ano"&gt;
                    &lt;xs:simpleType&gt;
                      &lt;xs:restriction base="xs:integer"&gt;
                        &lt;xs:minInclusive value="1975"/&gt;
                        &lt;xs:maxInclusive value="2005"/&gt;
                      &lt;/xs:restriction&gt;
                    &lt;/xs:simpleType&gt;
                  &lt;/xs:attribute&gt;
                &lt;/xs:complexType&gt;
              &lt;/xs:element&gt;

              &lt;xs:element name="direccion" type="xs:string" minOccurs="1"/&gt;

              &lt;xs:element name="telefonoFijo" type="xs:string"/&gt;
              &lt;xs:element name="telefonoMovil" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/&gt;

              &lt;xs:element name="foto" type="xs:anyURI" minOccurs="0"/&gt;
            &lt;/xs:sequence&gt;
          &lt;/xs:complexType&gt;
        &lt;/xs:element&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;

&lt;/xs:schema&gt;
  

2. Ejemplo de personas.xml


&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:noNamespaceSchemaLocation="personas.xsd"&gt;

  &lt;persona&gt;
    &lt;nombre&gt;Ana&lt;/nombre&gt;
    &lt;apellidos&gt;García López&lt;/apellidos&gt;
    &lt;sexo&gt;Mujer&lt;/sexo&gt;
    &lt;nacimiento dia="15" mes="marzo" ano="1985"/&gt;
    &lt;direccion&gt;Calle Falsa 123, Madrid&lt;/direccion&gt;
    &lt;telefonoFijo&gt;912345678&lt;/telefonoFijo&gt;
    &lt;telefonoMovil&gt;612345678&lt;/telefonoMovil&gt;
    &lt;foto&gt;imagenes/ana.jpg&lt;/foto&gt;
  &lt;/persona&gt;

  &lt;persona&gt;
    &lt;nombre&gt;Luis&lt;/nombre&gt;
    &lt;apellidos&gt;Pérez Ruiz&lt;/apellidos&gt;
    &lt;sexo&gt;Hombre&lt;/sexo&gt;
    &lt;direccion&gt;Av. Siempre Viva 742, Sevilla&lt;/direccion&gt;
    &lt;telefonoFijo&gt;954321987&lt;/telefonoFijo&gt;
  &lt;/persona&gt;

&lt;/personas&gt;
  

3. DTD equivalente (personas.dtd)


<!ENTITY 

&lt;!ELEMENT personas (persona+) &gt;

&lt;!ELEMENT persona (nombre, apellidos, sexo, nacimiento?, direccion, telefonoFijo, telefonoMovil*, foto?) &gt;
&lt;!ELEMENT nombre 
&lt;!ELEMENT apellidos 
&lt;!ELEMENT sexo (Hombre|Mujer) &gt;
&lt;!ELEMENT nacimiento EMPTY &gt;
&lt;!ATTLIST nacimiento
  dia   CDATA   #REQUIRED
  mes   (enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) #REQUIRED
  ano   CDATA   #REQUIRED
&gt;
&lt;!ELEMENT direccion 
&lt;!ELEMENT telefonoFijo 
&lt;!ELEMENT telefonoMovil 
&lt;!ELEMENT foto EMPTY &gt;
&lt;!ATTLIST foto
  src CDATA #REQUIRED
&gt;
  

Ejercicio 4: Consultas XQuery

Asumimos el XML raíz <biblioteca> y cada libro como <libro id="…">. Aquí van las consultas:

1. Libros con <editorial>


for $b in doc("libros2.xml")//libro[editorial]
return $b
  

2. Títulos de libros con >1 autor


for $b in doc("libros2.xml")//libro[count(autor) &gt; 1]
return &lt;titulo&gt;{ $b/titulo/text() }&lt;/titulo&gt;
  

3. Títulos de libros publicados después de 2004


for $b in doc("libros2.xml")//libro[year &gt; 2004]
return $b/titulo
  

4. Cada libro: título + número de autores


for $b in doc("libros2.xml")//libro
let $n := count($b/autor)
return &lt;libro&gt;
         &lt;titulo&gt;{ $b/titulo/text() }&lt;/titulo&gt;
         &lt;autores&gt;{ $n }&lt;/autores&gt;
       &lt;/libro&gt;
  

5. Libros con precio > 40


for $b in doc("libros2.xml")//libro[number(precio) &gt; 40]
return
  &lt;resultado id="{ $b/@id }"&gt;
    { $b/titulo }
    { $b/autor }
  &lt;/resultado&gt;
  

6. “Bases de Datos”: todo salvo <autor>


for $b in doc("libros2.xml")//libro[titulo = "Bases de Datos"]
return
  &lt;libro id="{ $b/@id }"&gt;
    { $b/@* }
    { for $c in $b/*[name() != 'autor'] return $c }
  &lt;/libro&gt;
  

7. Addison-Wesley tras 2005


for $b in doc("libros2.xml")//libro[editorial = "Addison-Wesley" and year &gt; 2005]
return $b
  

8. Tabla HTML: título + lista de autores


let $tabla :=
  &lt;table border="1"&gt;
    &lt;tr&gt;&lt;th&gt;Título&lt;/th&gt;&lt;th&gt;Autores&lt;/th&gt;&lt;/tr&gt;
    {
      for $b in doc("libros2.xml")//libro
      return
        &lt;tr&gt;
          &lt;td&gt;{ $b/titulo/text() }&lt;/td&gt;
          &lt;td&gt;{
            string-join($b/autor/text(), ", ")
          }&lt;/td&gt;
        &lt;/tr&gt;
    }
  &lt;/table&gt;
return $tabla
  

¡Listo! Con este post tienes todos los pasos y el código completo para resolver los ejercicios del examen. 🎓

Deja una respuesta

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

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

¿Atascado con tu proyecto? Presupuesto GRATIS

X
error: Content is protected !!
Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad