2009-06-24 6 views
1

Nous avons une situation où nous voulons limiter un élément à avoir:un élément à Restreindre ayant du texte ou des sous-éléments

  • texte Soit(). ou
  • Sous-éléments.

E.g.

<a>mytext</a> 

ou

<a><b>xxx</b></a> 

Mais pas:

<a>mytext<b>xxx</b></a> 

Étant donné le mécanisme xs:simpleContent je peux limiter à avoir seul texte, et bien sûr je peux définir l'élément (s) il peut être autorisé, mais est-ce que quelqu'un sait comment je peux combiner les deux pour permettre le texte ou les sous-éléments, mais pas les deux?

Ta Jamie

+2

Exactement cette question a été posée à: http://stackoverflow.com/questions/381782/xml-schema-element-that-can-contain-elements-or-text. Je ne sais pas comment je l'ai manqué! Votez pour fermer si vous aimez. –

Répondre

3

Une autre option est pour vous d'utiliser l'héritage. Votre XML résultant est pas aussi joli, mais vous obtenez exactement le contenu que vous voulez:

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

Ensuite, votre XML résultant contiendrait les éléments suivants (en supposant que vous avez déclaré quelque part xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance")

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

ou

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

plus important encore, il ne permettant pas

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

Merci d'avoir soulevé cette question - je n'étais pas au courant du mécanisme d'héritage. –

Questions connexes