2008-12-19 140 views
31

我該如何定義一個可以包含純文本或包含元素的元素?說我想以某種方式允許這兩種情況下:XML架構:可以包含元素或文本的元素?

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

......所以,這兩個元素是有效的:

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

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

你不能使用xs:choice嗎? – 2014-09-17 14:19:39

回答

21

我做了一些這方面的研究已有一段時間,只溶液我發現了所用的混合屬性:

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

這可悲還允許

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

希望有人會給出更好的答案。

+0

如何使用`xs:choice`? – Paciv 2012-10-26 13:09:58

+0

切換到XSD 1.1並使用條件類型分配。但是您需要像Saxon EE這樣的XSD 1.1實現不是免費的:)我不知道任何免費的XSD 1.1實現 – lkuty 2014-11-26 09:49:34

12

另一種選擇是讓你使用繼承。你得到的XML是不是很漂亮,但你得到完全相同的內容你想要的:

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

那麼你得到的XML將包含以下(假設你有xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"地方申報)

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

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

最重要的是,它不允許

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