Tutoriales de informática - Abrirllave.com

Abrirllave.com

Ejercicio de XSD - Registro de conexiones

Si para representar la siguiente información ficticia:

REGISTRO DE CONEXIONES DE USUARIOS Y EMPLEADOS DE UNA EMPRESA

USUARIOS:

IDENTIFICADOR NOMBRE APELLIDOS EMAIL

CONEXIONES (FECHA HORA TIEMPO)

U123&Ana&Sanz Tapia&asanz@jmail.com

2014-02-23&19:15:40&122

2014-02-23&20:30:22&617

2014-02-24&11:18:31&25

U96&Pedro&Ruiz Hierro&pruiz@jotmail.com

2014-02-25&20:33:55&390

EMPLEADOS:

IDENTIFICADOR NOMBRE APELLIDOS EMAIL DEPARTAMENTO

CONEXIONES (FECHA HORA TIEMPO)

E4&Marta&Vera Gil&mvera@yajoo.es&Marketing

(Ninguna)

se ha escrito el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<registro xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="registro.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>

Escribir el código del archivo "registro.xsd" que permita validarlo, teniendo en cuenta que:

Solución:

"registro.xsd"

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="registro">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="personas"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:group name="personas">
    <xs:sequence>
        <xs:element name="usuario" minOccurs="0" maxOccurs="unbounded" type="tipoPersona"/>
        <xs:element name="empleado" minOccurs="0" maxOccurs="unbounded" type="tipoPersonaAmpliado"/>
    </xs:sequence>
  </xs:group>

  <xs:complexType name="tipoPersonaAmpliado">
    <xs:complexContent>
      <xs:extension base="tipoPersona">
        <xs:sequence>
          <xs:element name="departamento">
            <xs:complexType>
              <xs:sequence>
                <xs:group ref="departamentosEmpresa"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="tipoPersona">
    <xs:sequence>
      <xs:group ref="datosPersona"/>
    </xs:sequence>
    <xs:attribute name="identificador" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="[UE]\d{1,5}"/>
          </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:group name="datosPersona">
    <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: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: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="atributosConexion"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

    </xs:sequence>
  </xs:group>

  <xs:attributeGroup name="atributosConexion">
    <xs:attribute name="fecha" type="xs:date" use="required"/>
    <xs:attribute name="hora" type="xs:time" use="required"/>
  </xs:attributeGroup>

  <xs:group name="departamentosEmpresa">
    <xs:choice>
      <xs:element name="administración"/>
      <xs:element name="informática"/>
      <xs:element name="marketing"/>
    </xs:choice>
  </xs:group>
  
</xs:schema>