2008-12-19 17 views
31

Düz metin içerebilen veya öğeler içerebilen bir öğeyi nasıl tanımlarım? Bu iki element geçerli olacak şekilde ...XML Şeması: Öğe veya metin içerebilen öğe?

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

: Bir şekilde bu gibi durumlarda her ikisi için izin istedi Say

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

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

xs'yi kullanamazsınız: choice? –

cevap

21

Bu konuda biraz araştırma bir süre önce yaptığı ve tek

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

Bu ne yazık ki aynı zamanda

<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> 
sağlar: bulduğum çözüm karışık niteliğini kullanılan etmekti

Umarım birileri daha iyi bir cevap verecektir.

+0

Xs: choice' kullanma hakkında ne düşünüyorsunuz? – Paciv

+0

XSD 1.1'e geçin ve koşullu tip atamasını kullanın. Ama özgür olmayan bir Saxon EE gibi bir XSD 1.1 uygulamasına sahip olmanız gerekir :) Herhangi bir ücretsiz XSD 1.1 uygulamasının farkında değilim. – lkuty

12

Bir başka seçenek miras kullanmanızdır. Sizin sonuç XML olarak hoş değil, ama tam olarak istediğiniz içeriği almak:

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

Sonra sonuç XML aşağıdaki içerecektir

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

ya

(eğer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" yerde ilan var varsayarak)
<field xsi:type="no-subfield">your other stuff</field> 

En önemlisi,

izin vermiyor
+0

Eğer xsi'den kaçınmak isterseniz: tipini de kullanabilirsiniz. ve foo 'ı koyun ama yine de aynı alan etiketinden miras alır. –