Ejercicio 423
Consideremos el siguiente documento XML:
<registro>
<usuario identificador="U123">
<apellidos-y-nombre>Sanz Tapia,Ana</apellidos-y-nombre>
<email>asanz@jmail.com</email>
<conexiones>
<conexión fecha="2014-02-23" hora="19:15:40">122</conexión>
<conexión fecha="2014-02-23" hora="20:30:22">617</conexión>
<conexión fecha="2014-02-24" hora="11:18:31">25</conexión>
</conexiones>
</usuario>
<usuario identificador="U96">
<apellidos-y-nombre>Ruiz Hierro,Pedro</apellidos-y-nombre>
<email>pruiz@jotmail.com</email>
<conexiones>
<conexión fecha="2014-02-25" hora="20:33:55">390</conexión>
</conexiones>
</usuario>
<empleado identificador="E4">
<apellidos-y-nombre>Vera Gil,Marta</apellidos-y-nombre>
<email>mvera@yajoo.es</email>
<conexiones/>
<departamento>
<marketing />
</departamento>
</empleado>
</registro>
Escribe un XML Schema para validar el tipo de documento XML descrito, eligiendo los tipos de datos más apropiados y teniendo en cuenta que:
- Todos los elementos y atributos son obligatorios, a menos que se indique lo contrario.
- Siempre que sea posible, se deben agrupar los elementos o atributos (con
groupoattributeGroup). - El registro consiste en una serie de usuarios y una serie de empleados.
- Tanto los usuarios como los empleados, pueden no aparecer, aparecer una vez o varias veces.
- El elemento
<usuario>debe ser de un tipo definido por nosotros al que llamaremostipoPersona, donde hay que definir los elementos<apellidos-y-nombre>,<email>y<conexiones>. - El elemento
<empleado>ha de ser de un tipo llamadotipoPersonaAmpliado, definido como una extensión detipoPersona, añadiéndosele el elemento<departamento>. - El orden en que tienen que aparecer los elementos hijo de
<usuario>y<empleado>, debe ser obligatoriamente el escrito en el documento XML. - El valor del identificador debe ser una cadena formada por una letra
UoE(mayúsculas), seguida de 1 a 5 cifras. - El valor del elemento
<apellidos-y-nombre>debe ser una cadena de entre 1 a 30 caracteres (de laaa laz, mayúsculas o minúsculas, o el carácter espacio en blanco) para los apellidos, seguida del carácter coma (,) y de entre 1 a otras 20 letras (de laaa laz, también mayúsculas o minúsculas, o el carácter espacio en blanco) para el nombre. - El valor del email puede ser una cadena formada por 1 a 15 caracteres de la
aa laz, seguida del carácter@, seguido de entre 1 a otras 25 letras de laaa laz, seguidas del carácter punto (.) y de entre otras 2 a 4 letras de laaa laz. - De cada usuario y empleado se reflejan sus conexiones, indicando para cada conexión la cantidad de segundos que duró, que debe ser un número entero mayor que cero.
- Conexiones puede no haber ninguna, una o varias.
- Respecto a los atributos
fechayhora, cada uno de ellos debe definirse del tipo que se considere más apropiado. - Los posibles departamentos de la empresa a los que puede pertenecer un empleado son
administración,informáticaomarketing. De tal forma que, para cada empleado, solo uno de ellos debe escribirse en el documento XML mediante un elemento vacío, como en este caso se ha escrito<marketing />. - No hay que definir más tipos de datos que los indicados en el ejercicio:
tipoPersonaytipoPersonaAmpliado.
Solución
XML
<?xml version="1.0" encoding="UTF-8"?>
<registro
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="423.xsd">
<usuario identificador="U123">
<apellidos-y-nombre>Sanz Tapia,Ana</apellidos-y-nombre>
<email>asanz@jmail.com</email>
<conexiones>
<conexión fecha="2014-02-23" hora="19:15:40">122</conexión>
<conexión fecha="2014-02-23" hora="20:30:22">617</conexión>
<conexión fecha="2014-02-24" hora="11:18:31">25</conexión>
</conexiones>
</usuario>
<usuario identificador="U96">
<apellidos-y-nombre>Ruiz Hierro,Pedro</apellidos-y-nombre>
<email>pruiz@jotmail.com</email>
<conexiones>
<conexión fecha="2014-02-25" hora="20:33:55">390</conexión>
</conexiones>
</usuario>
<empleado identificador="E4">
<apellidos-y-nombre>Vera Gil,Marta</apellidos-y-nombre>
<email>mvera@yajoo.es</email>
<conexiones/>
<departamento>
<marketing />
</departamento>
</empleado>
</registro>
423.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="registro">
<xs:complexType>
<xs:group ref="usuario-empleado"></xs:group>
</xs:complexType>
</xs:element>
<xs:group name="usuario-empleado">
<xs:sequence>
<xs:element name="usuario" type="tipoPersona" minOccurs="0" maxOccurs="unbounded"></xs:element>
<xs:element name="empleado" type="tipoPersonaAmpliado" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:group>
<xs:complexType name="tipoPersona">
<xs:sequence>
<xs:group ref="persona"></xs:group>
</xs:sequence>
<xs:attribute name="identificador" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[UE][0-9]{1,5}"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:group name="persona">
<xs:sequence>
<xs:element name="apellidos-y-nombre">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z ]{1,30},[a-zA-Z ]{1,20}"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="email">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]{1,15}@[a-z]{1,25}\.[a-z]{2,4}"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="conexiones">
<xs:complexType>
<xs:sequence>
<xs:element name="conexión" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:positiveInteger">
<xs:attributeGroup ref="datetime"></xs:attributeGroup>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="datetime">
<xs:attribute name="fecha" type="xs:date" use="required"></xs:attribute>
<xs:attribute name="hora" type="xs:time" use="required"></xs:attribute>
</xs:attributeGroup>
<xs:complexType name="tipoPersonaAmpliado">
<xs:complexContent>
<xs:extension base="tipoPersona">
<xs:sequence>
<xs:element name="departamento">
<xs:complexType>
<xs:choice>
<xs:group ref="departamento"></xs:group>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:group name="departamento">
<xs:choice>
<xs:element name="administración">
<xs:complexType></xs:complexType>
</xs:element>
<xs:element name="informática">
<xs:complexType></xs:complexType>
</xs:element>
<xs:element name="marketing">
<xs:complexType></xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
</xs:schema>