2010-04-22 52 views
15

如何設計我的xsd忽略元素順序?忽略使用xs的元素順序:擴展名

<root> <a/> <b/> </root> 

<root> <b/> <a/> </root> 

我需要使用extension代碼生成的原因,所以我嘗試以下使用all

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:complexContent> 
      <xs:extension base="t:BaseType"> 
       <xs:all> <!-- ERROR --> 
        <xs:element name="b" type="xs:string" /> 
       </xs:all> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema> 

此XSD無效儘管如此,報道Ë以下錯誤在<!-- ERROR -->

COS-全limited.1.2:含{分鐘發生} = {發生最大} = 1的所有模型組必須出現在粒子,而且粒子必須是部分構成複合類型定義的{內容類型}的一對中的一個。

cos-all-limited.1.2文檔說:

1.2的顆粒的含{發生最大} = 1,這是一對部分中的{術語}屬性構成的複合型的{內容類型}定義。

我不是很懂這個(既不是xsd也不是英文母語:))。


我做錯了什麼,我做錯了什麼,或者沒有辦法做到這一點?

回答

6

MAJOR EDIT本來我錯過了需要使用xsd:extension的要求。請注意,xsd:extension的工作方式好像存在xsd:sequence,其基本類型的內容後跟擴展類型的內容。作爲XML模式入門所說:

當一個複雜類型由 擴展衍生,其有效的內容模型 是基本類型 加在 類型派生指定的內容模型的內容模型。此外,兩個內容模型被視爲一個順序組的兩個 孩子。

因此,使這項工作的唯一方法是有一個空的基本類型和存儲整個備選方案在擴展類型,反之亦然(基地和一個空的擴展)。就像這樣:

<xsd:complexType name="ExtendedType"> 
    <xsd:complexContent> 
     <xsd:extension base="BaseType"> 
     <xsd:choice> 
      <xsd:sequence> 
       <xsd:element name="a" type="xsd:string"/> 
       <xsd:element name="b" type="xsd:string"/> 
      </xsd:sequence> 
      <xsd:sequence> 
       <xsd:element name="b" type="xsd:string"/> 
       <xsd:element name="a" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:choice> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xsd:complexType name="BaseType"/> 

<xsd:element name="root" type="ExtendedType"/> 
+0

@Peter對,我錯過了一部分。這是一個更新。 – Bolo 2010-04-22 10:45:09

+0

感謝您的更新。不幸的是,我需要在基類型中定義一些元素,並且在擴展中定義一些元素,所以除非有另一種方式,否則擴展類型的元素將始終必須放在基類型的元素之後... – 2010-04-22 10:55:45

+0

@Peter在這種情況下,由於「兩個內容模型被視爲一個連續組的兩個孩子」,所以沒有辦法(據我所知)忽略這個序列。 – Bolo 2010-04-22 12:09:04

-3

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

<xs:complexType name="ExtendedType"> 
    <xs:complexContent> 
     <xs:extension base="t:BaseType"> 
      <xs:sequence> 
       <xs:element name="b" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="root" type="t:ExtendedType"></xs:element> 

+0

@Ruslan:你試過這個嗎?它會在'b'之前執行'a'的順序,所以它實際上並不能幫助我...... – 2010-04-22 13:46:15

6

這裏是限制的解釋: http://marc.info/?l=xerces-j-user&m=118712527901786&w=4

就可以使複雜的類型,唯一的擴展名的 「全」模型是添加一些屬性。您無法使用新元素進行擴展。

在我來說,我已經做了這樣的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> <!-- copy/paste from BaseType --> 
      <xs:element name="b" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema>