Tipos de datos y restricciones en XSD

1. ¿Qué son los tipos de datos en XSD?

Un tipo de dato en XSD define qué clase de información puede contener un elemento o atributo de un documento XML.

Si no se define, por defecto todo se interpreta como texto (xs:string). Con tipos de datos, podemos validar si un valor es un número, una fecha, un booleano, etc. Esto es lo que diferencia a XSD de un DTD, que solo trataba los valores como texto.

2. Tipos de datos en XSD

a) Tipos simples (predefinidos por W3C)

  • xs:string: texto.
  • xs:integer: número entero (…, -2, -1, 0, 1, 2, …).
  • xs:decimal: número decimal (ej. 123.45).
  • xs:boolean: true o false.
  • xs:date: fecha en formato YYYY-MM-DD.
  • xs:time: hora en formato HH:MM:SS.
  • xs:dateTime: fecha y hora combinadas (YYYY-MM-DDTHH:MM:SS).
  • xs:anyURI: una URL.
  • xs:ID: un identificador único dentro del documento XML.

Ejemplo:

<xs:element name="edad" type="xs:integer"/>
<xs:element name="activo" type="xs:boolean"/>
<xs:element name="fechaNacimiento" type="xs:date"/>
<xs:element name="paginaWeb" type="xs:anyURI"/>

b) Tipos complejos

Se usan para agrupar otros elementos o atributos. (Este tema se profundiza más adelante; aquí nos enfocamos en restricciones sobre tipos simples).

3. Restricciones en XSD (facetas)

Las facetas permiten restringir los valores posibles de un elemento o atributo.

a) Restricción de valores numéricos

<xs:element name="edad">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
  • minInclusive: valor mínimo permitido (incluido).
  • maxInclusive: valor máximo permitido (incluido).

Aquí edad solo puede ser un número entre 0 y 120.

b) Restricción de longitud de cadenas

<xs:element name="nombre">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:minLength value="3"/>
      <xs:maxLength value="50"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
  • minLength: número mínimo de caracteres.
  • maxLength: número máximo de caracteres.

El nombre debe tener entre 3 y 50 caracteres.

c) Restricción por patrón (expresiones regulares)

<xs:element name="codigoPostal">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{5}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

El codigoPostal debe ser exactamente 5 dígitos. Ejemplo válido: 50000. Ejemplo inválido: AB123.

d) Restricción por enumeración

<xs:element name="estadoCivil">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="soltero"/>
      <xs:enumeration value="casado"/>
      <xs:enumeration value="divorciado"/>
      <xs:enumeration value="viudo"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

estadoCivil solo puede tomar uno de esos 4 valores.

e) Restricción por valores decimales

<xs:element name="precio">
  <xs:simpleType>
    <xs:restriction base="xs:decimal">
      <xs:minExclusive value="0.0"/>
      <xs:maxInclusive value="9999.99"/>
      <xs:fractionDigits value="2"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
  • minExclusive: el valor debe ser mayor a 0.
  • maxInclusive: el valor máximo es 9999.99.
  • fractionDigits: máximo 2 decimales.

Ejemplo válido: <precio>99.95</precio> — Ejemplo inválido: <precio>-10.00</precio>.

4. Ejemplo completo de restricciones en XSD

Archivo empleado.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="empleado">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nombre">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="3"/>
              <xs:maxLength value="50"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        
        <xs:element name="edad">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="18"/>
              <xs:maxInclusive value="65"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        
        <xs:element name="estadoCivil">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="soltero"/>
              <xs:enumeration value="casado"/>
              <xs:enumeration value="divorciado"/>
              <xs:enumeration value="viudo"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        
        <xs:element name="salario">
          <xs:simpleType>
            <xs:restriction base="xs:decimal">
              <xs:minExclusive value="0.0"/>
              <xs:maxInclusive value="100000.00"/>
              <xs:fractionDigits value="2"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Archivo empleado.xml válido

<?xml version="1.0" encoding="UTF-8"?>
<empleado xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="empleado.xsd">

    <nombre>Carlos Pérez</nombre>
    <edad>35</edad>
    <estadoCivil>casado</estadoCivil>
    <salario>45000.50</salario>

</empleado>

Archivo empleado.xml inválido

<empleado>
    <nombre>Al</nombre> <!-- Error: menos de 3 caracteres -->
    <edad>70</edad> <!-- Error: fuera del rango 18-65 -->
    <estadoCivil>union libre</estadoCivil> <!-- Error: no está en enumeración -->
    <salario>123456.789</salario> <!-- Error: excede máximo permitido y decimales -->
</empleado>

5. Resumen didáctico

  • XSD permite definir tipos de datos estrictos (string, int, boolean, date, etc.).
  • Se pueden aplicar restricciones (facetas) para validar la información: minInclusive, maxInclusive (rangos); minLength, maxLength (longitud); pattern (regex); enumeration (lista); fractionDigits (decimales).
  • Gracias a estas reglas, se garantiza que los datos XML cumplen con requisitos reales (ej.: edad válida, precios positivos, etc.).