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>