Al igual que con los documentos XML, un archivo XSD comienza con la declaración XML estándar, seguida de la declaración del Schema XML
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
.....
</xs:schema>
El elemento xs:annotation en XML Schema Definition (XSD) se utiliza para agregar metadatos a la definición del esquema, como documentación o comentarios explicativos. A diferencia de los comentarios XML (<!-- comentario -->), que son simplemente ignorados por los procesadores XML y XSD, xs:annotation puede contener información adicional que puede ser utilizada por herramientas que procesan el esquema, como generadores de documentación o IDEs (Entornos de Desarrollo Integrado).
El elemento xs:annotation puede contener dos tipos de elementos hijos:
xs:documentation: Proporciona información textual sobre el elemento al que pertenece la anotación. Puede ser utilizado para describir la intención, el uso o cualquier otro tipo de guía sobre el elemento del esquema.
xs:appinfo: Contiene información que puede ser utilizada por aplicaciones específicas. Esto podría incluir configuraciones, reglas o cualquier otro dato que las aplicaciones necesiten para procesar correctamente el XML basado en el esquema.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="persona">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string">
<xs:annotation>
<xs:documentation>El nombre completo de la persona.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
<xs:element> en XML Schema (XSD) se utiliza para definir un elemento dentro de un documento XML. Es uno de los componentes fundamentales en la definición de esquemas XML, permitiendo especificar el nombre del elemento, su tipo de datos, y otras restricciones como la cardinalidad (por ejemplo, si es opcional o requerido y cuántas veces puede aparecer).
Un elemento se define <xs:element name="" type=""/>
name: El nombre del elemento.
type: El tipo de dato del elemento, que puede ser un tipo simple (como xs:string, xs:int).
<xs:element name="titulo" type="xs:string"/>
Este ejemplo define un elemento llamado titulo que contiene datos de tipo cadena (xs:string).
Un <xs:element> de tipo complejo en XML Schema (XSD) se utiliza para definir un elemento que puede contener otros elementos, atributos, o una combinación de ambos. A diferencia de los tipos simples que contienen solo texto y no pueden tener atributos ni elementos anidados, los tipos complejos ofrecen una estructura más rica y versátil para los datos.
name: Especifica el nombre del elemento.
type: (Opcional si se usa xs:complexType internamente) Define el tipo de datos del elemento. Para un tipo complejo, se puede referir a un xs:complexType definido previamente.
Si se omite el atributo type y en su lugar se utiliza una definición interna de xs:complexType, esta define directamente la estructura del elemento.
minOccurs: La cantidad mínima de veces que el elemento debe aparecer. El valor predeterminado es 1.
maxOccurs: La cantidad máxima de veces que el elemento puede aparecer. El valor predeterminado es 1. Para indicar que el elemento puede aparecer un número ilimitado de veces, se utiliza "unbounded".
Definición interna de tipo complejo:
Puedes definir la estructura compleja directamente dentro del elemento usando <xs:complexType> sin necesidad de especificar el atributo type.
<xs:element name="libro">
<xs:complexType>
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="autor" type="xs:string"/>
<!-- Más elementos según se requiera -->
</xs:sequence>
<xs:attribute name="isbn" type="xs:string"/>
</xs:complexType>
</xs:element>
Este ejemplo define un elemento libro que es de tipo complejo, conteniendo subelementos titulo y autor, y un atributo isbn.
Referencia a un tipo complejo definido:
Alternativamente, puedes definir el tipo complejo por separado y luego referenciarlo en el elemento.
<xs:complexType name="TipoLibro">
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="autor" type="xs:string"/>
<!-- Más elementos según se requiera -->
</xs:sequence>
<xs:attribute name="isbn" type="xs:string"/>
</xs:complexType>
<xs:element name="libro" type="TipoLibro"/>
Aquí, el tipo complejo TipoLibro se define primero, y luego el elemento libro se define para ser de ese tipo.
xs:sequence: Define que los elementos deben aparecer en un orden específico.
xs:choice: Permite que solo uno de los elementos contenidos sea presente.
xs:all: Permite que los elementos aparezcan en cualquier orden, cada uno no más de una vez.
xs:group: Permite reutilizar definiciones de grupo de elementos.
xs:attribute: Define un atributo para el elemento.
Los tipos complejos ofrecen una flexibilidad considerable en la definición de estructuras de documentos XML, permitiendo modelar datos de manera precisa y detallada para satisfacer necesidades específicas de información y validación.
Se utiliza para definir un grupo de elementos que deben aparecer en un documento XML en el orden especificado. Dentro de un <xs:sequence>, cada elemento se espera que ocurra en la secuencia en la que se declaran. Este elemento es fundamental para modelar estructuras de documentos XML donde el orden de los elementos es importante para la interpretación correcta de los datos.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definición de un elemento complejo 'Libro' -->
<xs:element name="Libro">
<xs:complexType>
<xs:sequence>
<xs:element name="Titulo" type="xs:string"/>
<xs:element name="Autor" type="xs:string"/>
<xs:element name="AnioPublicacion" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
El elemento <xs:choice> en un esquema XML Schema (XSD) permite definir un grupo de elementos, de los cuales solo uno puede aparecer en el documento XML correspondiente. Es decir, dentro de un <xs:choice>, se presentan varias opciones de elementos, pero solo se puede seleccionar y utilizar uno de esos elementos en cualquier instancia del documento XML que cumpla con el esquema.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definición de un elemento complejo 'Contacto' -->
<xs:element name="Contacto">
<xs:complexType>
<xs:choice>
<xs:element name="Email" type="xs:string"/>
<xs:element name="Telefono" type="xs:string"/>
<xs:element name="Direccion" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
El elemento <xs:all> define un grupo de elementos que pueden aparecer en cualquier orden en el documento XML, pero cada elemento debe ocurrir cero o una vez. Es decir, a diferencia de <xs:sequence>, que exige un orden específico para los elementos, y <xs:choice>, que permite solo uno de los elementos definidos, <xs:all> permite cualquier ordenación de sus elementos hijos, pero cada uno de ellos no puede aparecer más de una vez.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definición de un elemento complejo 'Persona' -->
<xs:element name="Persona">
<xs:complexType>
<xs:all>
<xs:element name="Nombre" type="xs:string"/>
<xs:element name="Apellido" type="xs:string" minOccurs="0"/>
<xs:element name="Edad" type="xs:int" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
Se utiliza para definir un grupo de elementos que pueden ser reutilizados en varias definiciones de tipos complejos dentro del esquema. Este mecanismo permite a los diseñadores de esquemas crear conjuntos de elementos que se pueden incluir en múltiples definiciones de tipo complejo, facilitando así la reutilización y el mantenimiento del esquema.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definición del grupo -->
<xs:group name="informacionContacto">
<xs:sequence>
<xs:element name="telefono" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:group>
...
...
<!-- Uso del grupo en un tipo complejo -->
<xs:complexType name="tipoPersona">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellido" type="xs:string"/>
<!-- Inclusión del grupo -->
<xs:group ref="informacionContacto"/>
</xs:sequence>
</xs:complexType>
</xs:schema>