EXAMEN PRESENCIAL 2 RESUELTO

Anuncio
I.E.S. Suárez de Figueroa
@vanza
C.F.G.S. Administración de Sistemas Informáticos en Red
Módulo "Lenguaje de Marcas y Sistemas de Gestión de la Información"
Segunda Evaluación - Examen Presencial
Para los cuatro ejercicios se utilizará el siguiente fichero .xml:
4 de abril de 2016
Cada ejercicio vale 2,5 puntos
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE agenda>
<agenda>
<maximo>500</maximo>
<persona clase="contacto" tipo="3">
<nombre>Antonio Ramos Gando</nombre>
<ciudad>Zafra</ciudad>
<tfno>666-00.00.00</tfno>
<tfno>942-23.23.23</tfno>
</persona>
<persona clase="contacto">
<nombre>Juana Llera Zambrano</nombre>
<cp>06001</cp>
<tfno>677-00.00.00</tfno>
</persona>
<persona clase="contacto" tipo="1">
<nombre>Elena Rial Pedraza</nombre>
<cp>06310</cp>
<tfno>655-11.11.11</tfno>
<tfno>924-01.01.01</tfno>
<tfno>924-12.34.56</tfno>
</persona>
</agenda>
1. Crear el fichero.dtd correspondiente al fichero .xml anterior, cumpliendo las siguientes condiciones:
- La agenda tiene un máximo (que no es obligatorio) y una serie de personas (podría no haber ninguna
persona).
- La clase valdrá siempre "contacto".
- El tipo, que no es obligatorio, valdrá 1, 2 o 3 (uno de esos tres valores).
- La persona tiene un y sólo un nombre obligatoriamente.
- La persona tendrá elemento ciudad o elemento cp, pero no ambos, sino uno de los dos.
- En cada persona habrá al menos un tfno, pero puede haber más.
SOLUCIÓN:
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
agenda (maximo?, persona*)>
maximo (#PCDATA)>
persona (nombre, (ciudad | cp), tfno+)>
persona clase NMTOKEN #FIXED "contacto">
persona tipo (1 | 2 | 3) #IMPLIED>
nombre (#PCDATA)>
ciudad (#PCDATA)>
cp (#PCDATA)>
tfno (#PCDATA)>
2. Crear el fichero.xsd para el fichero .xml anterior, cumpliendo las siguientes condiciones:
- Deben elegirse los tipos base que mejor se adapten a los datos del fichero .xml.
- La agenda tiene un máximo (que no es obligatorio) y una serie de personas (podría no haber ninguna
persona).
- El máximo debe ser un valor entre 100 y 1000 (ambos inclusive).
- Cada persona tiene los elementos siguientes: nombre, ciudad, cp y una serie de tfno (al menos hay un tfno).
- La ciudad y el cp no son obligatorios.
- La clase es obligatoria y puede tomar cualquier valor; el tipo no es obligatorio y es un número entero positivo.
- Tanto el nombre como la ciudad no podrán tener más de 25 caracteres.
- El cp debe formarse obligatoriamente con un dígito de 0 a 5 y después cuatro dígitos más de 0 a 9 cada uno.
SOLUCIÓN:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="agenda" type="tipo_agenda"/>
<xs:complexType name="tipo_agenda">
<xs:sequence>
<xs:element name="maximo" type="tipo_maximo" minOccurs="0"/>
<xs:element name="persona" type="tipo_persona" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="tipo_maximo">
<xs:restriction base="xs:positiveInteger">
<xs:minInclusive value="100" />
<xs:maxInclusive value="1000" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="tipo_persona">
<xs:sequence>
<xs:element name="nombre" type="tipo_nombre_ciudad" />
<xs:element name="ciudad" type="tipo_nombre_ciudad" minOccurs="0"/>
<xs:element name="cp" type="tipo_cp" minOccurs="0"/>
<xs:element name="tfno" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="clase" type="xs:string" use="required"/>
<xs:attribute name="tipo" type="xs:positiveInteger"/>
</xs:complexType>
<xs:simpleType name="tipo_nombre_ciudad">
<xs:restriction base="xs:string">
<xs:maxLength value="25"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="tipo_cp">
<xs:restriction base="xs:string">
<xs:pattern value="[0-5][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
3. Sobre el fichero .xml inicial, escribir las siguientes expresiones XPath:
a) Mostrar o seleccionar la ciudad de las personas cuyo cp esté entre 06000 y 10000.
b) Mostrar o seleccionar el maximo de la agenda sólo en caso de que haya alguna persona sin tipo.
c) Mostrar o seleccionar los tfno de las personas cuyo tipo valga 1 o 3.
d) Mostrar o seleccionar la segunda persona completa si la agenda tiene más de 1 persona (2 o más).
e) Mostrar o seleccionar la clase y el nombre de las personas que tengan algún atributo (uno cualquiera).
SOLUCIÓN:
a)
b)
c)
d)
e)
//persona[cp >= 06000 and cp <= 10000]/ciudad
//persona[not(@tipo)]/../maximo
//persona[@tipo = 1 or @tipo=3]/tfno
/agenda[count(persona) > 1]/persona[2]
//persona[@*]/@clase | //persona[@*]/nombre
4. Escribir el fichero.xsl que al aplicarlo sobre el fichero .xml inicial debe darle el formato HTML que se indica
más abajo. Como puede verse, deben aparecer los nombres y el primer tfno de las personas de la clase
"contacto", ordenadas por nombre de la "Z" a la "A". Todos los datos deben ser extraídos del fichero .xml.
SOLUCIÓN:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<html>
<head><title>Transformación</title></head>
<body bgcolor="#bbbbbb">
<h1>Agenda</h1>
<h2>Tiene ( <xsl:value-of select="count(/agenda/persona)"/> ) personas,
de un tamaño máximo de ( <xsl:value-of select="/agenda/maximo"/> ).</h2>
<h3>Personas de clase "contacto":</h3>
<table border="1" style="border-style:double;">
<tr><td>Nombre</td><td>Primer tfno</td></tr>
<xsl:for-each select="/agenda/persona">
<xsl:sort select="nombre" order="descending"/>
<xsl:if test="@clase = 'contacto'">
<tr>
<td><xsl:value-of select="nombre"/></td>
<td><xsl:value-of select="tfno[1]"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Descargar