2015-10-15 57 views
0

我喜歡下面的XSD有一個類型層次結構:A型 - > B型 - > C型...更改simpleType元素的限制兒童型

現在B型的定義如下:

<xs:complexType name="TypeB"> 
    <xs:complexContent> 
     <xs:extension base="TypeA" > 
     <xs:sequence> 
      ... 
      <xs:element name="ElementA" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:int"> 
       <xs:minInclusive value="0"/> 
       <xs:maxInclusive value="10"/> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

C型並不需要添加到B型的任何元件因此被定義一樣:

<xs:complexType name="TypeC"> 
    <xs:complexContent> 
     <xs:extension base="TypeB"> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

現在對於ElementA的Type C限制已經改變 - 它的maxIncluse應該是5而不是10.

我可以改變Type C,但改變Type B不應該破壞兼容性。 有沒有辦法在不破壞兼容性/現有層次的情況下更改限制?

回答

1

您可以通過將TypeC聲明爲TypeB的限制並明確重新定義其複雜內容來實現此目的。但是,爲了使其正常工作,您需要顯式聲明簡單類型,該類型將xs:int限制在0到10之間,並將其顯式限制爲另一個將maxInclusive更改爲5的簡單類型。重要的是,此簡單類型限制是顯式的如解釋here

架構可能看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ElementC" type="TypeC"/> 
    <xs:complexType name="TypeA"> 
    <xs:sequence> 
     <xs:element name="foobar" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="TypeB"> 
    <xs:complexContent> 
     <xs:extension base="TypeA" > 
     <xs:sequence> 
      <xs:element name="ElementA" type="Type10" minOccurs="0"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
    <xs:simpleType name="Type10"> 
    <xs:restriction base="xs:int"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="10"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="Type5"> 
    <xs:restriction base="Type10"> 
     <xs:maxInclusive value="5"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="TypeC"> 
    <xs:complexContent> 
     <xs:restriction base="TypeB"> 
     <xs:sequence> 
      <xs:element name="foobar" type="xs:string"/> 
      <xs:element name="ElementA" type="Type5" minOccurs="0"/> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

,然後這將是有效的:

<?xml version="1.0" encoding="UTF-8"?> 
<ElementC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="schema.xsd"> 
    <foobar/> 
    <ElementA>5</ElementA> 
</ElementC> 

,這不:

<?xml version="1.0" encoding="UTF-8"?> 
<ElementC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="schema.xsd"> 
    <foobar/> 
    <ElementA>6</ElementA> 
</ElementC> 
+0

Visual Studio中告訴我: '元素具有相同名稱並且在相同範圍內必須具有相同類型.'當我在類型C中使用' MrWombat

+0

這很奇怪。我用oXygen成功地嘗試了這個模式,並且一切正常,以驗證第一個文檔並拒絕第二個文檔。 Visual Studio背後的模式處理器是什麼? –

+0

對不起,這是我的錯! 謝謝你的幫助! – MrWombat