2011-08-05 117 views
1

我有以下问题:是否可以从我的XML模式中删除此冗余?

我有两个复合类型,foobar同时与会员foobar

<xs:complexType name="foo"> 
    <xs:sequence> 
    <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="bar"> 
    <xs:sequence> 
    <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

以减少冗余,我要声明一个foobar的一个复杂类型,其被引用在这两个foobar,这样的事情:

<xs:complexType name="foobar"> 
    <xs:sequence> 
    <xs:element type="xs:string /> 
    </xs:sequence> 
</xs:complexType> 

但这似乎并没有被正确的方式。这实际上可能在XML模式中吗?

回答

1

我还没有检查正确性以下,但我相信你能做到这一点是这样的:

<xs:complexType name="hasFoobar" abstract="true"> 
    <xs:sequence> 
     <xs:element name="foobar" … /> 
    </xs:sequence> 
    </xs:complexType> 

然后在“扩展”这个抽象类型:

<xs:complexType name="foo"> 
    <xs:complexContent> 
     <xs:extension base="hasFoobar"> 
     … 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="bar"> 
    <xs:complexContent> 
     <xs:extension base="hasFoobar"> 
     … 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
3

你可能最好使用xs:group而不是复杂类型的元素:

<xs:complexType name="foo"> 
    <xs:group ref="foobarGroup"/> 
</xs:complexType> 

<xs:complexType name="bar"> 
    <xs:group ref="foobarGroup"/> 
</xs:complexType> 

<xs:group name='foobarGroup'> 
    <xs:sequence> 
     <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" /> 
    </xs:sequence>   
</xs:group> 

你c不要直接将该序列表示为xs:complexType的一部分。