Saltar al contenido principal

Ejercicio 426

Consideremos el siguiente documento XML:

<documento>
<comentario>Texto comentario</comentario>

<principal>
Este <ref to="p1"/> <ref to="p4"/> escrito
por <autor>mi</autor>. Con
este <ref to="p2"/> se
ganará el premio nobel de <ref to="p4"/>
</principal>

<parte id="p1">texto</parte>
<parte id="p2"> <ref to="p1"/> complejo</parte>
<parte id="p3">far <ref to="p3"/></parte>
<parte id="p4">largo</parte>
</documento>

Elabora el fichero XSD que permita validarlo, teniendo en cuenta que:

  • El elemento principal puede contener tanto texto como las etiquetas ref o autor.
  • El atributo id del elemento parte es un identificador.
  • El atributo to del elemento ref hace referencia a un identificador.
  • El elemento parte puede contener texto o elementos.
Solución
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="documento" type="tipoDocumento"/>

<xs:complexType name="tipoDocumento">
<xs:sequence>
<xs:element name="comentario" type="xs:string"/>
<xs:element name="principal" type="tipoPrincipal"/>
<xs:element name="parte" type="tipoParte" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="tipoPrincipal" mixed="true">
<xs:choice maxOccurs="unbounded">
<xs:element name="ref" type="tipoRef"/>
<xs:element name="autor" type="xs:string"/>
</xs:choice>
</xs:complexType>

<xs:complexType name="tipoParte" mixed="true">
<xs:sequence>
<xs:element name="ref" type="tipoRef" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>

<xs:complexType name="tipoRef">
<xs:attribute name="to" type="xs:IDREF" use="required"/>
</xs:complexType>
</xs:schema>