validacion tutorial tipos significa que opcional minoccurs español elemento datos xml xsd

xml - tutorial - validacion xsd



Esquema XML: ¿Elemento que puede contener elementos o texto? (2)

¿Cómo definiría un elemento que puede contener texto sin formato o contener elementos? Digamos que quería permitir de alguna manera estos dos casos:

<xs:element name="field"> <xs:complexType> <xs:sequence> <xs:element ref="subfield" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> <xs:attribute name="name" type="xs:string" /> </xs:complexType> </xs:element> <xs:element name="field" type="xs:string" />

... para que ambos elementos sean válidos:

<field name="test_field_0"> <subfield>Some text.</subfield> </field> <field name="test_field_1">Some more text.</field>


Hice algunas investigaciones sobre esto hace un tiempo y la única solución que encontré fue usar el atributo mixto:

<xs:element name="field"> <xs:complexType mixed="true"> <xs:sequence> <xs:element ref="subfield" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> <xs:attribute name="name" type="xs:string" /> </xs:complexType> </xs:element>

Esto, lamentablemente, también permite

<field name="test_field_0"> Some text I''m sure you don''t want. <subfield>Some text.</subfield> More text you don''t want. </field>

Con suerte, alguien dará una mejor respuesta.


Otra opción es que use herencia. Su XML resultante no es tan bonito, pero obtiene exactamente el contenido que desea:

<xsd:element name="field" type="field" abstract="true" /> <xsd:element name="subfield" type="xsd:string" /> <xsd:complexType name="field" abstract="true" /> <xsd:complexType name="subfield"> <xsd:complexContent> <xsd:extension base="field"> <xsd:sequence> <xsd:element ref="subfield" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" /> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="no-subfield"> <xsd:complexContent mixed="true"> <xsd:extension base="field"> <xsd:attribute name="name" type="xsd:string" /> </xsd:extension> </xsd:complexContent> </xsd:complexType>

Entonces su XML resultante contendría lo siguiente (suponiendo que tiene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" declarado en algún lugar)

<field xsi:type="subfield"> <subfield>your stuff here</subfield> </field>

o

<field xsi:type="no-subfield">your other stuff</field>

Lo más importante, no permite

<field xsi:type="subfield"> Text you don''t want <subfield>your stuff here</subfield> More text you don''t want </field>