xsd:如何使用无序的元素列表扩展类型

时间:2010-09-27 21:45:54

标签: xsd

这是我的xml架构的一部分

<xs:complexType name="Friend">
    <xs:all>
        <xs:element name="name" type="xs:string" />
        <xs:element name="phone" type="xs:string" />
        <xs:element name="address" type="xs:string" />
    </xs:all>
</xs:complexType>

<xs:complexType name="Coworker">
    <xs:all>
        <xs:element name="name" type="xs:string" />
        <xs:element name="phone" type="xs:string" />
        <xs:element name="office" type="xs:string" />
    </xs:all>
</xs:complexType>

为了更好的可维护性,我希望在(抽象)超类型或类似的东西中拥有共享属性。但更重要的是,我希望所有元素都是无序的,也是可选的。

这是可能的,最好的方法是什么?

2 个答案:

答案 0 :(得分:15)

您必须稍微限制一下,在XML Schema中无法实现您尝试做的一些事情。

假设您引入了一个名为Person的复杂类型作为FriendCoworker的超类型。您可以选择以下选项:

  1. xs:all替换为xs:sequence,从子类型中删除namephone,添加到超类型,然后添加继承。现在必须订购您的元素,但您可以单独选择它们。在XML Schema中的类型层次结构中使用xs:all 非法,因为处理器无法分辨父内容模型停止的位置以及子内容模型的启动。
  2. 在两种类型中将xs:all替换为<xs:choice maxOccurs="unbounded">,然后添加您的继承。然后你的元素再次变得无序,但它们可能会重复。
  3. 总而言之:鉴于你的类型名称,我猜你的要求不会完全得到满足。我会选择第一个选项:坚持任意元素顺序通常不像看起来那么有用。

答案 1 :(得分:3)

此问题和接受的答案发布一年半后,XSD 1.1 was published。在此版本中,可以指定OP的要求,因为取消了对xs:all的限制。其中之一是现在可以扩展xs:all

使用XSD 1.1,您可以指定以下内容:

<xs:complexType name="Person" abstract="true">
    <xs:all>
        <xs:element name="name" type="xs:string" minOccurs="0" />
        <xs:element name="phone" type="xs:string" minOccurs="0" />
    </xs:all>
</xs:complexType>
<xs:complexType name="Friend">
    <xs:complexContent>
        <xs:extension base="Person">
            <xs:all>
                <xs:element name="address" type="xs:string" minOccurs="0" />
            </xs:all>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="Coworker">
    <xs:complexContent>
        <xs:extension base="Person">
            <xs:all>
                <xs:element name="office" type="xs:string" minOccurs="0" />
            </xs:all>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这定义了以下类型:

  • Person:具有可选无序namephone元素的抽象类型;
  • Friend:扩展Person,将一个可选的address元素添加到无序元素列表中;
  • Coworker:扩展Coworker,将一个可选的office元素添加到无序元素列表中。

请注意,此解决方案不适用于每个XML处理器:尽管自XSD 1.1发布以来已经过去了8年,但许多处理器仍仅支持XSD 1.0。