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>