complexContent
El elemento simpleContent
se utiliza para describir el contenido de un elemento cuando el contenido es de un tipo complejo (contiene otros elementos).
Este elemento se puede utilizar para establecer restricciones o para combinar con extensiones.
Como elemento XSD destinado para el contenido de elementos, no se aplica a atributos.
Restricciones
Consideremos el siguiente documento XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="colores" type="lista-colores"/>
<xs:complexType name="lista-colores">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="color" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
En este esquema:
- Se está definiendo un elemento
<colores>
el cual es de tipolista-colores
. - El tipo
lista-colores
es uncomplexContent
, es decir, un tipo de elemento que contiene otros elementos. - Los elementos de
lista-colores
se definen dentro de un elementorestriction
, el cual debe ser del tipoxs:anyType
. - Dentro de
restriction
se define un elementosequence
y un elementoelement
. De momento, ignoraremos cómo se utilizasequence
. Solo tenemos que saber que si queremos definir unelement
, debe ser dentro de unsequence
. - El elemento
element
define un elemento<color>
, el cual contiene una cadena de caracteres. - El elemento
<color>
puede aparecer tantas veces como sea necesario, así lo determina el atributomaxOcurrs
, que cuando toma el valorunbounded
significa que no hay limitación de ocurrencias, es decir, las ocurrencias del elemento son ilimitadas.
El código anterior permite validar un documento XML como el siguiente:
<colores>
<color>Amarillo</color>
<color>Rojo</color>
<color>Azul</color>
</colores>
De forma alternativa, existe una forma abreviada del documento XSD anterior:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="colores" type="lista-colores"/>
<xs:complexType name="lista-colores">
<xs:sequence>
<xs:element name="color" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Como se puede observar, los elementos complexContent
y restriction
se pueden omitir.
Extensiones
Consideremos el siguiente documento XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="fichero" type="info"/>
<xs:complexType name="info">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
</xs:sequence>
<xs:attribute name="extension" type="xs:string"/>
</xs:complexType>
</xs:schema>
El él se está definiendo un elemento <fichero>
que contiene otro elemento <nombre>
. Además, <fichero>
tiene un atributo extension
. El tipo de dato del elemento fichero
se está definiendo mediante un complexType
, al cual se lle llama info
.
El XSD anterior, por ejemplo, permite validar el siguiente documento XML:
<fichero extension="xml">
<nombre>documento.xml</nombre>
</fichero>
Si queremos aprovechar el tipo de dato info
y queremos añadir dos elementos adicionales, lo haríamos de la siguiente manera:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="fichero" type="metadatos"/>
<xs:complexType name="info">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
</xs:sequence>
<xs:attribute name="extension" type="xs:string"/>
</xs:complexType>
<xs:complexType name="metadatos">
<xs:complexContent>
<xs:extension base="info">
<xs:sequence>
<xs:element name="creacion" type="xs:dateTime"/>
<xs:element name="edicion" type="xs:dateTime"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Podemos observar que se crea otro complexType
llamado metadatos
. Este tipo de dato extiende info
, es decir, aprovecha lo que hay definido y añade más definiciones. En este caso, se añaden dos nuevos elementos: <creacion>
y <edicion>
. Por último, se modifica el valor del atributo type
del elemento <fichero>
. De esta forma, se define un nuevo tipo.
Un documento XML que sería validado por el documento anterior sería el siguiente:
<fichero extension="xml">
<nombre>documento.xml</nombre>
<creado>2022-12-25T08:00:00</creado>
<editado>2023-01-13T08:00:00</editado>
</fichero>
Podemos observar como el XML es muy similar al anterior presentado: solo se añaden dos nuevos elementos.