是否可以从我的XML架构中删除此冗余?

时间:2011-08-05 08:11:23

标签: xml xsd redundancy

我有以下问题:

我有两个复杂类型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声明为complexType,它在foobar中都被引用,如下所示:

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

但这似乎不是正确的方法。这在XML Schema中实际可行吗?

2 个答案:

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