2008-12-19 131 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> 
相关问题