Solución a Esquema XML do Bánco Simpático Galego

De MediaWiki
Ir a la navegación Ir a la búsqueda

Esquema XML do Bánco Simpático Galego

Crea un esquema XML que valide o fichero XML creado no exercicio anterior.

Inclúense a continuación as especificacións que tiñamos para a creación do fichero XML e alguhna máis que deben ser consideradas para a realización deste exercicio.

  • O banco consta de sucursais e de empregados. Para coñecer os empregados que traballan nunha sucursal debense utilizar claves.
  • O banco ten o código 4444, e tamén queremos coñecer o seu nome completo, abreviatura, nome e apelidos do seu presidente, data de creación que debe ter 3 atributos: día, mes y año, e información das sucursais das que consta.
  • Cada sucursal ten un código de catro díxitos e unha superficie que terá un atributo unidade que tomará sempre coma valor “m2”.
  • Para cada sucursal queremos coñecer o personal do que consta. Os empregados identificaranse cun código, e ademáis para cada un dos empregados queremos coñecer o seu nome e apelidos (que serán obligatorios), o seu NSS (constará de 12 díxitos) e o cargo que ocupan na sucursal (que pode ser “Director”, “Interventor” e “Outros”).
  • O formato do código será o seguinte:
  • Como moito terá 6 caracteres
  • Comenzará pola letra E seguida deuhna vogal en maiúsculas.
  • A continuación poden vir: dous número do 3 ao 6, ou o número 9.
  • Termina con duos ou tres letras en minúscula.
  • No caso de non coñecer o cargo que ocupa unha persona, este debe tomar o valor nulo.
  • Debes crear como mínimo dúas sucursais coa información correspondente.
NOTA. Valorarase o uso de diferentes tipos de datos, a reutilización de tipos e calquer outra característica propia dos XML Schemas.

Solución

XSD – banco.xsd 
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:wmh="http://www.wmhelp.com/2003/eGenerator" elementFormDefault="qualified">
  <xs:group name="nomeCompleto">
    <xs:sequence>
      <xs:element name="nome" type="nomeCorto"/>
      <xs:element name="apelido1" type="nomeCorto"/>
      <xs:element name="apelido2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="banco">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nome" type="nomeLongo"/>
        <xs:element ref="presidente"/>
        <xs:element ref="dataCreación"/>
        <xs:element ref="sucursais"/>
        <xs:element ref="empregados"/>
      </xs:sequence>
      <xs:attribute name="codigo" type="tipoCodigo" fixed="4444"/>
      <xs:attribute name="abreviatura" type="xs:string"/>
    </xs:complexType>
    <xs:key name="sucursal">
      <xs:selector xpath="sucursais/sucursal"/>
      <xs:field xpath="@codigo"/>
    </xs:key>
    <xs:keyref name="departamento" refer="sucursal">
      <xs:selector xpath="empregados/empregado"/>
      <xs:field xpath="sucursal"/>
    </xs:keyref>
  </xs:element>
  <xs:element name="presidente">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="nomeCompleto"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="dataCreación">
    <xs:complexType>
      <xs:attribute name="día" type="xs:string" use="required"/>
      <xs:attribute name="mes" type="xs:string" use="required"/>
      <xs:attribute name="ano" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="sucursais">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="sucursal" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="sucursal">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="superficie"/>
      </xs:choice>
      <xs:attribute name="codigo" type="tipoCodigo"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="superficie">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="unidade" type="xs:string" fixed="m2"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="empregados">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="empregado" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="empregado">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="nomeCompleto"/>
        <xs:element name="sucursal" type="xs:string"/>
        <xs:element name="cargo" type="tipoCargo" nillable="true"/>
      </xs:sequence>
      <xs:attribute name="codigo" type="tipoCodigoEmpregado" use="required"/>
      <xs:attribute name="NSS" type="tipoNSS" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="tipoCodigo">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9][0-9][0-9][0-9]"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="nomeCorto">
    <xs:restriction base="xs:string">
      <xs:maxLength value="30"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="nomeLongo">
    <xs:restriction base="xs:string">
      <xs:maxLength value="150"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="tipoNSS">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{12}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="tipoCodigoEmpregado">
    <xs:restriction base="xs:string">
      <xs:maxLength value="6"/>
      <xs:pattern value="E[AEIOU]([3-6][3-6]|9)[a-z]{2,3}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="tipoCargo">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Director"/>
      <xs:enumeration value="Interventor"/>
      <xs:enumeration value="outros"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>