2010-09-27 59 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