我有以下问题:
我有两个复杂类型foo
和bar
,其成员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声明为complexType,它在foo
和bar
中都被引用,如下所示:
<xs:complexType name="foobar">
<xs:sequence>
<xs:element type="xs:string />
</xs:sequence>
</xs:complexType>
但这似乎不是正确的方法。这在XML Schema中实际可行吗?
答案 0 :(得分:4)
最好不要使用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>
您无法直接将序列表达为xs:complexType
的一部分。
答案 1 :(得分: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>