2008-12-19 11 views
31

¿Cómo definiría un elemento que puede contener texto sin formato o contener elementos? Dicho que quiera para permitir de alguna manera para ambos casos:Esquema XML: ¿Elemento que puede contener elementos o texto?

<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" /> 

... de manera que estos dos elementos serían válidas:

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

<field name="test_field_1">Some more text.</field> 
+0

¿no puedes usar xs: choice? –

Respuesta

21

me hizo una investigación sobre este hace un tiempo y el único solución que encontré fue utilizado 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> 

Este tristemente 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> 

Afortunadamente, alguien dará una mejor respuesta.

+0

¿Qué le parece usar 'xs: choice'? – Paciv

+0

Cambie a XSD 1.1 y use la asignación de tipo condicional. Pero necesita tener una implementación de XSD 1.1 como Saxon EE que no es gratuita :) No conozco ninguna implementación gratuita de XSD 1.1 – lkuty

12

Otra opción es que usted use la herencia. Su XML resultante no es tan bonita, pero se 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> 

A continuación, el XML resultante contendría lo siguiente (suponiendo que tiene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" declarado en alguna parte)

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

o

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

más importante es que no permite

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

Si desea evitar xsi: type también puede definir subsitutionGroups con diferentes nombres de elementos para que pueda poner en x y foo pero seguir heredando de la misma etiqueta de campo. –

Cuestiones relacionadas