2010-09-27 66 views
8

的无序列表扩展型这是我的XML模式XSD:如何用元素

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

为了更好的可维护性的一部分,我想有共同的属性在(摘要)超类型或类似的东西。但更重要的是,我希望所有元素都是无序的,也是可选的。

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

回答

13

您必须稍微限制一下自己,您尝试做的一些事情在XML模式中是不可行的。

假设您引入了一个称为Person的复杂类型,它是FriendCoworker的超级类型。这里是你的选择:

  1. 更换xs:allxs:sequence,从子类中删除namephone,增加了超强型,并添加继承。您的元素现在必须订购,但您可以单独选择它们。这是非法在XML Schema中的类型层次结构中使用xs:all,因为处理器无法知道父内容模型停止在哪里并且子内容模型启动。
  2. 用两种类型替换xs:all<xs:choice maxOccurs="unbounded">,并添加您的继承。然后你的元素再次变得无序,但它们可能会重复。

所以总结一下:如果您的类型名称存在,我猜测您的要求将不会完全满足。我会选择第一个选项:坚持任意元素顺序通常不如看起来那么有用。

+0

我很害怕这样。所以(1)它会。 – Cephalopod 2010-09-28 17:28:53