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
group
oattributeGroup
). - 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
U
oE
(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 laa
a 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 laa
a 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
a
a laz
, seguida del carácter@
, seguido de entre 1 a otras 25 letras de laa
a laz
, seguidas del carácter punto (.
) y de entre otras 2 a 4 letras de laa
a 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
fecha
yhora
, 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ática
omarketing
. 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:
tipoPersona
ytipoPersonaAmpliado
.
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>