Saltar al contenido principal

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.

Tipo de contenido

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 tipo lista-colores.
  • El tipo lista-colores es un complexContent, es decir, un tipo de elemento que contiene otros elementos.
  • Los elementos de lista-colores se definen dentro de un elemento restriction, el cual debe ser del tipo xs:anyType.
  • Dentro de restriction se define un elemento sequence y un elemento element. De momento, ignoraremos cómo se utiliza sequence. Solo tenemos que saber que si queremos definir un element, debe ser dentro de un sequence.
  • 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 atributo maxOcurrs, que cuando toma el valor unbounded 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.