Skip to content

Tema 3. Validació de documents XML (XSD)

James Clark, desenvolupador d'eines XML i XSL

"XML Schema es tan poderoso que puede hacer casi todo lo que quieras. Y tan complejo que nadie querrá hacerlo."

3.1. Esquemes a XML, una introducció (XSD i DTD).

Una vegada el nostre document XML és correcte sintàcticament (està ben format), veurem com validar-lo. Els esquemes serveixen per a comprobar que un document XML és vàlid respecte a un conjunt de regles ben definit. Donat el següent XML:

<llibre isbn="0-2777-6861-6">
  <autor>J.D. Salinger</autor>
  <titol>The Catcher in the Rye</titol>
</llibre>

Un esquema permetria validar, per exemple, la següent estructura i regles:

  • L'estructura dels elements i els atributs. Per exemple, l'element llibre ha de contenir els elements autor i titol, i opcionalment l'atribut isbn.

  • L'ordre dels elements. Per exemple, podem especificar que l'element autor va abans que titol,

  • Tipus de dades dels elements i els atributs. Enter, decimal o cadena de texte són alguns exemples. També es poden definir tipus de dades basades en rangs, enumeracions o coincidència de patrons (patterns). Per exemple, podem definir que l'atribut isbn tingui el patró 0-0000-0000-0.

Els esquemes XML aporten les següents funcionalitats:

  • Servir com a contracte entre empreses que es suministren productes. Un esquema indica clarament quins elements han d'aparèixer en els documents que rebrà. Per exemple, pot especificar que totes les factures indiquin el NIF de l'empresa a qui es factura.

  • Documentació de sistema. Permet a qualsevol que vulgui, entendre els noms, atributs i estructura del document XML. També es poden fer anotacions.

  • Incorporació de dades noves XSD permet incorporar valors per defecte i fixes al document XML. També permet normalitzar els espais en blanc.

XML Schema o XSD (XML Schema Definition) permet definir de forma molt precisa el contingut dels documents XML i és el que farem servir en aquesta unitat. També existeixen altres llenguatges d'esquema:

  • Relax NG. Basat en gramàtica. És més fàcil d'entendre que XML Schema. Desenvolupat per Oasis.

  • Schematron. Està basat en afirmacións enlloc de gramàtica.

També hi ha utilitats per convertir d'aquests formats a XSD.

3.1.1. DTD i XSD

Un document ben format pot ser validat amb les tecnologies DTD (Document Type Definition) o XSD (XML Schema).

DTD defineix els blocs o elements d'un document XML. DTD prové d'un subconjunt del llenguatge SGML. Des de principis de 2000, DTD ha estat substituit per altres opcions com XSD o Relax NG, principalment degut a les seves limitacions.

Algunes de les seves limitacions són:

  • Un document DTD no és un document XML, per tant no podem verificar que estigui ben format.
  • No es poden fer restriccions sobre els diferents valors que pot pendre un element: tamany, tipus de dades, etc.
  • No es pot donar un valor per defecte per als elements (si els atributs).
  • No soporta espais de noms.

L'alternativa als documents DTD són els esquemes XML o XSD (XML Schema Definition).

XSD supera les limitacions de DTD:

  • Els documents XSD deriven de XML, per tant són documents XML i es poden comprobar sintàcticament.
  • XSD defineix molts tipus de dades predefinits.
  • XSD permet definir la cardinalitat dels elements.
  • XSD permet mesclar diferents vocabularis XML (espais de noms).

Els documents XSD tenen l'inconvenient de que són lleugerament més difícils d'interpretar que els DTD.

Un Esquema XML és el motlle d'on sortiran els diferents documents XML que compliran l'estructura definida a l'esquema, cadascun amb les seves dades concretes.

Per validar els documents XML, podem fer servir les eines de programació vistes fins ara. També podem trobar alguns validadors on-line, com per exemple:

CoreFiling XML Schema Validator

3.2. Estructura d'un esquema XML.

Per crear un esquema XSD seguim els seguents passos:

  1. Crear el document XML que volem validar. P. ex.: arxiu.xml.
  2. Crear el document de validació (XSD) en un arxiu apart amb extensió .xsd. P. ex.: arxiu.xsd.
  3. Enllaçar el document XML amb el XSD.

Per indicar-li a un document XML quin document de validació volem fer servir, afegirem un atribut a l'element arrel del document XML.

3.2.1. Regles XSD

Un esquema XML és un document XML que ha de complir les següents regles:

<?xml version="1.0"?>
<xs:schema xmnls:xs ="http://www.w3.org/2001/XMLSchema">
.....
</xs:schema>
  • Igual que a DTD, el primer que hem de fer és declarar l'element arrel del nostre XML. La sintaxi de xs:element seria:
<xs:element name = "nom-element-arrel">

Aquest element conté l'atribut name que defineix l'element arrel del document. XSD permet tenir més d'un element arrel al nostre esquema.

<?xml version="1.0"?>
  <xs:schema xmlns:xs ="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cotxe" />
  <xs:element name="vaixell" />
</xs:schema>
  • L'ordre en que es declaren els elements (anomenats components a XSD) no és rellevant.

3.2.2. Vinculació d'un document XML amb un document XSD.

  • Per a vincular un esquema amb un document XML hem d'afegir l'atribut noNamespaceSchemaLocation a l'element arrel del nostre document XML:
<?xml version = “1.0” encoding = “UTF-8”?>
<arrel xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation = “landrover.xsd”>
  ...
</arrel>

En l'exemple anterior, a l'arxiu landrover.xsd tindrem les nostres declaracions XSD. Els blocs principals d'un esquema XSD són xs:element i xs:attribute, que veurem a continuació.

3.2.3. Elements

Els elements i els atributs són els blocs principals amb els que es construeixen els documents XML. Per tant, el nostre esquema XSD contindrà una declaració per a cada element i cada atribut que hi hagi al document.

Cadascun dels elements i atributs està associat a un tipus de dades (veure atribut type més endavant). XSD separa els conceptes d'element i atributs dels seus tipus de dades. Això permet reutilitzar la mateixa estructura a varis elements idèntics. Per exemple, a un a factura podem tenir dos elements anomenats adrecaenviament i adrecafacturacio que tenen la mateixa estructura pero noms diferents. Només hem de declarar un tipus TipoDireccion i fer-lo servir en la declaració dels elements.

Exemple d'estructura repetida:

<factura>
<capcelera>
  <shipping_address>
    <name></name>
    <street></street>
    <city></city>
  </shipping_address>

  <invoice_address>
    <name></name>
    <street></street>
    <city></city>
  <invoice_address>
</capcelera>
<cos></cos>
</factura>

Els elements han d'incloure com a mínim l'atribut name per especificar el nom de l'element XML i type per especificar el tipus de dades.

Exemples de declaració d'elements a XSD:

<!-- L'element nom utilitza el tipus predefinit xsd:string (veure **3.2.4. Tipus de dades** més endavant) -->
<xsd:element name="nom" type="xsd:string"/>

<nom>Joan</nom>

<!-- l'element __tamany__ fa servir el tipus __TamanyTipus__ per indicar el tipus de dades de l'element(veure 3.2.5. Definició de tipus de dades propis) -->
<xsd:element name="tamany" type="TamanyTipus"/>

<tamany>L</tamany>

<!-- 3 Si no hem especificat cap tipus de dades, el tipus serà __anyType__, que permet qualsevol contingut amb fills o caràcters. -->
<xsd:element name="anything"/>

Els atributs principals de <xs:element> són els següents:

nom atribut propòsit
name nom de l'element, obligatori si és l'arrel
ref nom d'un altre element que es troba en el document
type el tipus d'element (veure tipus de dades)
default valor per defecte de l'element. Només es pot utilitzar per a continguts amb texte.
fixed indica l'únic valor possible, sempre que sigui texte.
minOccurs número mínim d'ocurrències d'un element. veure indicadors.
maxOccurs número màxim d'ocurrències d'un element. veure indicadors.
id identificador únic per a l'element

3.2.4. Tipus de dades

Els tipus de dades predefinits més comuns a XSD són:

  • xs:string (cadena)
  • xs:decimal (número decimal)
  • xs:integer (sencer)
  • xs:boolean (veritable/fals)
  • xs:date (data)
  • anyURI (adreça web)

Exemples:

  <xs:element name="dia" type="xs:date" /> <dia>2011-09-15</dia>
  <xs:element name="altura" type="xs:integer"/> <altura>220</altura>
  <xs:element name="nombre" type="xs:string"/> <nombre>Pere Puig</nombre>
  <xs:element name="tamaño" type="xs:float"/> <tamany>1.7E2</tamany>

Tipus de dades predefinits a XSD (https://www.w3.org)

3.2.5. Definició de tipus de dades propis.

Per a crear un tipus de dades nou personalitzat, fem el següent:

  1. Creem la definició del tipus mitjançant <xs:simpleType> o <xs:complexType>.
  2. Definim un element a XSD i li assignem el nou tipus de dades creat.

Per exemple, volem definir un tipus de dades anomenat tipus_samarreta que només pugui contenir els següents valors: M, L, XL, XXL.

<tamany>M</tamany>

El següent fragment XSD crea un tipus personalitzat simple mitjançant l'element xs:simpleType (el contingut no te altres elements fills i l'element no té atributs). La restricció tipus xs:enumeration defineix uns valors vàlids per a l'element . Les restriccions (també anomenades facetes) es veuen més endavant i permeten definir tipus de dades.

<!-- pas 1 -->
<xs:simpleType name="tipus_samarreta">
  <xs:restriction base="xs:string">
    <xs:enumeration value="L"/>
    <xs:enumeration value="M"/>
    <xs:enumeration value="XL"/>
    <xs:enumeration value="XXL"/>
  </xs:restriction>
</xs:simpleType>

<!-- pas 2 -->
<xs:element name="tamany" type="tipus_samarreta"/>

<!-- element XML -->
<tamany>L</tamany>    <!-- OK -->
<tamany>XXXL</tamany> <!-- No valida -->

El següent fragment XSD crea un tipus personalitzat anomenat tipus_edat indicant que el valor mínim ha de ser 1.

<!-- pas 1 -->
<xs:simpleType name="tipus_edat">
  <xs:restriction base="xs:integer">
    <xs:minExclusive value="0"/>
  </xs:restriction>
</xs:simpleType>

<!-- pas 2 -->
<xs:element name="edat" type="tipus_edat"/>

<!-- element XML -->
<edat>23</edat>
<edat>0</edat>        <!-- No valida -->

3.2.5. Atributs

Fem servir el component <xs:attribute> per especificar els atributs dels nostre document XML.

Atributs principals de <xs:attribute>:

nom atribut propòsit
name nom de l'atribut. Aquest atribut no pot aparèixer al mateix temps que ref
ref referència a la descripció de l'atribut que es troba en altre lloc de l'esquema. Si surt aquest atribut, no apareixeran els atributs type, ni form, ni podrà contenir un component xs:simpleType
type el tipus d'element (veure tipus de dades)
use indica si l'existència de l'atribut és opcional, obligatòria o prohibida (optional, required, prohibited)
default valor que prendrà l'atribut quan sigui procesat per alguna aplicació quan al document XML no hi té cap valor assignat. No pot aparèixer al mateix temps que fixed
fixed Valor únic que pot contenir el document. No pot aparèixer simultàniament amb default
id indica identificador únic per al atribut

Exemple:

<xs:attribute name="alias" type="xs:string"/>
<!-- Ahora podemos usarlo dentro de un elemento nombre -->
<nombre alias="Snake"> Plissken </nombre>

Un exemple complet:

XML Schema Tutorial

3.3. Data types i exemples.

Els tipus de dades permeten la validació del contingut dels elements i dels valors dels atributs. Poden ser tipus simples (simpleType) o tipus complexes (complexType).

Els elements que tenen assignats tipus simples tenen dades de caràcters, però no tenen elements fills o atributs. Si tenen fills o atributs, aleshores es consideren tipus complexes.

Els següents elements tenen tipus simple:

<tamany>L<tamany>

<comentari>va molt gran</comentari>

<tamanysDisponibles>10 L 2 M</tamanysDisponibles>

Per altra banda, els elements complexos poden tenir elements fills o atributs.

Els següents elements tenen tipus complexe:

<tamany sistema="EU">L<tamany>

<comentari>va <b>molt molt</b> gran</comentari>

<tamanysDisponibles>
  <size>10</size>
  <size>2</size>
</tamanysDisponibles>

Per declarar l’element <tamanysDisponibles> amb XSD:

<xs:element name="tamanysDisponibles">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="unbound" name="size" type="xs:integer"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Els atributs sempre són de tipus simple, doncs els atributs no poden tenir elements fills. Per veure com definir atributs, veure (3.3.2 Tipus simples)

3.3.1 Tipus complexes

El contingut d'un element són els caràcters de dades i elements fills dintre de les etiquetes. Hi ha quatre tipus de contingut per a tipus complexes: simple, element, mixed i buit. El tipus de contingut és independent dels atributs. És a dir tots els tipus de contingut poden tenir atributs o no.

A continuació tenim un exemple de cadascun i com definir-los a XSD.

  • Simple:
<tamany sistema="EU">10</size>

Definició amb XSD:

<xs:element name="tamany">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="sistema" type="xs:string"></xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  • Element:
    <producte>
      <numero>34D</numero>
      <tamany>10</tamany>
    </producte>
    

Definició amb XSD:

<xs:element name="producte">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="numero" type="xs:string"/>
      <xs:element name="tamany" type="xs:integer"/>
    </xs:sequence>          
  </xs:complexType>
</xs:element>  
  • Mixed (contingut mixte):
    <carta> Estimat <nomClient>Carles Puig</nomClient> ...</carta>
    

Definició amb XSD:

<xs:element name="carta">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="nomClient"></xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
  • Element Buit:
    <color valor="blau"/>
    

Definició amb XSD:

<xs:element name="color">
  <xs:complexType>
    <xs:attribute name="valor" type="TipusColorValors"/>
  </xs:complexType>
</xs:element>

3.3.2 Tipus simples (definició d'atributs i extensions)

Per definir un atribut per un element qualsevol, podem diferenciar si el contingut de l'element és simple o complex (conté altres elements). A continuació veiem dos exemples i com definir-los a XSD.

<!-- Exemple 1: aquest element és complexType (té atributs) pero el seu contingut és simple -->
<ciutat poblacio="45258">Reus</ciutat>

<!-- Exemple 2: aquest element és complexType (té atributs) i el seu contingut és complexe -->
<ciutat poblacio="45258">
  <nom>Reus</nom>
</ciutat>

Donat que el primer element té un contingut simple, hem d'extendre el contingut de texte. Per tant utilitzem la seqüencia d'elements: xs:complexType->xs:simpleContent->xs:extension.

<!-- Exemple 1: aquest element és complexType (té atributs) pero el seu contingut és simple -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ciutat">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="poblacio" type="xs:integer" use="required"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

En aquest cas definim l'atribut dintre de l'element complexe:

<!-- Exemple 2: aquest element és complexType (té atributs) pero el seu contingut és simple -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ciutat">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="nom" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="poblacio" type="xs:integer" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Es possible definir el primer exemple sense l'ús de simpleContent, per exemple declarant el contingut mixte:

<!-- Exemple 1 alternatiu: utilitzem el contingut mixte -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ciutat">
        <xs:complexType mixed="true">
            <xs:attribute name="poblacio" type="xs:integer" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

3.4. Indicadors

Hi ha set indicadors a XML. Els indicadors especifiquen com s'utilitzen els elements dintre del document XML. Per exemple defineixen l'ordre, el número de instàncies o l'obligatorietat.

3.4.1. Indicadors d'ordre

Cada element complexe (excepte els elements buits) conté un únic model de grup.

  • Sequence L'indicador sequence s'utilitza per indicar l'ordre dels elements fills (si apareixen) de l'element complexe. Els elements poden conentir un indicador d'ocurrència, com minOccurs, però aquest és opcional.

Exemple:

<xs:element name="employee">
<xs:complexType >
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="registration-date" type="xs:date"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
  • All L'indicador all es comporta com el seqüence, excepte que no es necessari que surtin tots els elements ni en el mateix ordre. Si surten, només poden sortir un cop.

Exemple:

<xsd:element name="samarreta">
  <xsd:complexType>
    <xsd:all>
      <xsd:element name="color" type="xsd:string"/>
      <xsd:element name="tamany" type="tamanys-roba"/>
    </xsd:all>
  </xsd:complexType>
</xsd:element>
  • Choice L'indicador choice declara un grup d'elements del qual només un sortirà un al document XML.

Exemple:

<xs:element name="vehicle-motor">
<xs:complexType >
  <xs:choice>
    <xs:element name="cotxe" type="xs:string"/>
    <xs:element name="moto" type="xs:string"/>
    <xs:element name="camio" type="xs:string"/>
  </xs:choice>
</xs:complexType>
</xs:element>

3.4.2. Indicadors d'ocurrència

Els indicadors d'ocurrència determinen el número de vegades que surt un element en el document XML. Els valor per defecte de minOccurs i maxOccurs és 1.

Els indicadors maxOccurs i minOccurs es poden utilitzar com a atributs dintre dels xs:element i els indicadors d'ordre (xs:sequence, xs:choice).

Exemple:

<xs:element name="book" maxOccurs="unbounded">
<xs:complexType>
  <xs:sequence>
    <xs:element name="cotxe" type="xs:string"/>
    <xs:element name="moto" type="xs:string"/>
    <xs:element name="camio" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
</xs:element>

Dintre d'aquests indicadors podem fer servir un valor numèric o unbounded que indica un número il.limitat d'elements.

3.4.3. Indicadors de grup

Group name i attributeGroup name Podem definir un grup d'elements o atributs, donar-li un nom i fer referència al grup desde una altra definició.

Exemple:

<xs:group name="persona-grup">
  <xs:sequence>
    <xs:element name="nom" type="xs:string"/>
    <xs:element name="cognom" type="xs:string"/>
    <xs:element name="data-naixement" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persona-group"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType> 

3.5. Facetes

Las restriccions a XSD -també anomenades facetes- s'utilizan per a definir un rang de valors acceptable per als elements simples o atributs XML.

1. Restriccions per rang de valors

El següent exemple defineix un element anomenat edat amb una restricció. El valor de l'edat no pot ser més petita que 0 o més gran que 120.

<xs:element name="edat">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

2. Restriccions per una sèrie de valors

Per limitar el contingunt d'un element XML a una sèrie acceptable de valors, farem servir la restricció d'enumeració. L'exemple que ve a continuació defineix un element anomenat cotxe amb una restricció. Els únics valors acceptables son: Audi, Golf, BMW.

<xs:element name="marca_cotxe">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

L'exemple de dalt també es pot escrire com segueix:

<xs:element name="car" type="marca_cotxe"/>
  <xs:simpleType name="marca_cotxe">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
    </xs:restriction>
</xs:simpleType>

Nota: En aquest cas el tipus "carType" es pot fer servir en altres elements perquè no és part de l'element "car".

3. Restriccions per una sèrie de valors (patrons)

Per limitar el contingut d'un element XML per a definir una sèrie de números o lletres que es poden fer servir, farem servir la restricció de patró. L'exemple següent defineix un element anomenat "letter" amb una restricció, que consisteix en contenir UNA lletra MINÚSCULA (de a fins a z).

<xs:element name="letter">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-z]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

En el següent exemple només s'admeten tres lletres majúscules (a fins z):

<xs:element name="initials">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z][A-Z][A-Z]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

En el següent exemple només s'admeten tres lletres majúscules o minúscules:

<xs:element name="initials">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

En el següent exemple només s'admet una de les següents lletres x, y o z:

<xs:element name="choice">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[xyz]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Només s'accepten cinc digits en seqüència, cada dígit ha d'estar en el rang 0 fins a 9.

<xs:element name="prodid">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

4. Restriccions amb els caràcters "white-space"

Per especificar com es tracten els caràcters "white-space", farem servir la restricció whiteSpace. El següent exemple defineix un element anomenat "address" amb una restricció. La restricció está establerta a "preserve", que vol dir que el processador XML no esborrarà cap caracter "white-space" (espais, tabuladors, noves línees i retorns de carro).

<xs:element name="address">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="preserve"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Aquest exemple utilitza replace, que reemplaça els caràcters whiteSpace amb espais:

<xs:element name="address">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="replace"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Aquest exemple utilitza collapse, que esborra tots els caràcters whiteSpace. Els espais en blanc múltiples es redueixen a un únic espai en blanc:

<xs:element name="address">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

5. Restriccions de tamany

Per a limitar la longitud d'un valor en un element farem servir les restriccions length, maxLength i minLength.

L'exemple següent defineix un element "password" amb la restricció que el valor ha de ser exactament de vuit caràcters:

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="8"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Aquest exemple defineix altre element "password" amb una restricció. El valor ha de tenir mínim cinc caràcters i un màxim de vuit.

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:minLength value="5"/>
      <xs:maxLength value="8"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

6. Restriccions disponibles per als tipus de dades

Restricció Descripció Valors
enumeration Defineix una llista de valors acceptables
fractionDigits Número màxim de decimals permesos >= 0
length Número exacte de caràcters o elements de llista permesos >= 0
maxExclusive Limit superior per valors numèrics <
maxInclusive Limit superior per valors numèrics <=
minExclusive Limit inferior per valors numèrics >
minInclusive Limit inferior per valors numèrics >=
maxLength Número máxim de caràcters o elements de llista permesos >= 0
minLength Número mínim de caràcters o elements de llista permesos >= 0
pattern Defineix la seqüència exacta de caràcters permesos regex
totalDigits Especifica el número exacte de dígits >= 0
whiteSpace Especifica com es tracten els espais en blanc preserve replace collapse

7. Altres exemples amb patrons (Expressions regulars)

Els patrons és un tipus de restricció molt potent que permet detectar patrons dintre d'una cadena.

El següent exemple defineix un element anomenat "letter" amb una restricció. Els valors acceptables són zero o més ocurrències de lletres en minúscula de la a a la z:

<xs:element name="letter">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="([a-z])*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

El següent exemple defineix un element anomenat "letter" amb una restricció. Els valors acceptables són un o més parells de lletres, cada parell format per una minúscula seguit d'una majúscula. Per exemple, "sToP" es validaria correctament amb aquest patró, però no les cadenes de caràcters "Stop", "STOP" or "stop".

<xs:element name="letter">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="([a-z][A-Z])+"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

El següent exemple defineix un element anomenat "genere" amb una restricció. Els únics valors acceptables són home o dona:

<xs:element name="genere">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="(home|dona)"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

El següent exemple defineix un element "password" amb una restricció. Ha d'haver exactament vuit caràcters seguits que poden ser lletres de la a a la z en (minúscula o majúscula) o un número del 0 al 9.

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z0-9]{8}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Els símbols que s'utilitzen a les expressions regulars (el que va dintre de l'element pattern), són els següents:

  • Metacaràcters Comuns:

    • .: Qualsevol caràcter excepte el caràcter de nova línea
    • \d: Dígit (equivalent a [0-9]).
    • \w: Caràcter de paraula (lletra, dígit o guió baix).
    • \s: Espai en blank
  • Quantificadors: estableixen el número de repeticions:

    • *: Zero o més repeticions.
    • +: Una o més repeticions.
    • ?: Zero o cap repetició.
    • {n}: Exactament n repeticions.
    • {n,}: Almenys n repeticions.
    • {n,m}: Entre n y m repeticions.
  • Grups i Alternatives:

    • (...): Agrupació de patrons.
    • |: Alternativa (OR).
    • []: rang de valors

Escapat de caràcters especiales:

  • Si volen un dels caràcters amb significat especial (com . o *), s'han d'escapar amb una barra invertida.

Veiem alguns exemples més. Per validar un número de telèfon a Espanya:

<xs:element name="telefon">
    <xs:simpleType>
        <xs:restriction base="xs:integer">
            <xs:pattern value="[69][0-9]{8}"></xs:pattern>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Primer tindrem el digit 6 ó 9 i després qualsevol combinació de 8 digits. Per validar una adreça d'email tenim la següent restricció

<xs:element name="email">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Za-z._%+-]+@[A-Za-z\.]+[A-Za-z]{2,}"></xs:pattern>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Aquesta expressió té tres parts:

  • [A-Za-z._%+-]+@. Aquesta primera part defineix la part anterior a l'arroba d'una adreça. Es permeten totes les lletres més els símbols _, %, + i - un número indefinit de vegades (simbol +).
  • [A-Za-z\.]+. La segona part (nom del domini) permet un número indefinit de totes les lletres i punts
  • [A-Za-z]{2,}. La part del TLD té mínim dues lletres o més (.com, .edu, .io).

Per últim, volem validar una data amb format americà (AAAA-MM-DD):

<xs:element name="data">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Aquesta expressió es divideix com segueix:

  • \d{4}-: quatre digits qualsevols seguit d'un guió.
  • (0[1-9]|1[0-2])-: el més pot ser un 0 més un digit del 1 al nou o un 1 més un altre 1 o un 2.
  • (0[1-9]|[12]\d|3[01]): el dia pot ser del 0 al 9, del 10 al 29 o el 30 i 31.

Aquest document està llicenciat sota els termes de la Licencia Creative Commons Attribution 4.0 International (CC BY 4.0).