这是我的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>
为了更好的可维护性,我希望在(抽象)超类型或类似的东西中拥有共享属性。但更重要的是,我希望所有元素都是无序的,也是可选的。
这是可能的,最好的方法是什么?
答案 0 :(得分:15)
您必须稍微限制一下,在XML Schema中无法实现您尝试做的一些事情。
假设您引入了一个名为Person
的复杂类型作为Friend
和Coworker
的超类型。您可以选择以下选项:
xs:all
替换为xs:sequence
,从子类型中删除name
和phone
,添加到超类型,然后添加继承。现在必须订购您的元素,但您可以单独选择它们。在XML Schema中的类型层次结构中使用xs:all
非法,因为处理器无法分辨父内容模型停止的位置以及子内容模型的启动。xs:all
替换为<xs:choice maxOccurs="unbounded">
,然后添加您的继承。然后你的元素再次变得无序,但它们可能会重复。总而言之:鉴于你的类型名称,我猜你的要求不会完全得到满足。我会选择第一个选项:坚持任意元素顺序通常不像看起来那么有用。
答案 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
:具有可选无序name
和phone
元素的抽象类型; Friend
:扩展Person
,将一个可选的address
元素添加到无序元素列表中; Coworker
:扩展Coworker
,将一个可选的office
元素添加到无序元素列表中。请注意,此解决方案不适用于每个XML处理器:尽管自XSD 1.1发布以来已经过去了8年,但许多处理器仍仅支持XSD 1.0。