2013-01-11 242 views
1

我試圖擴展複雜類型來改變其價值的minOccurs,我嘗試不同的東西沒有成功,這是我的基本類型:XSD擴展類型更改屬性值

<xs:complexType name="PhoneNumberType"> 
    <xs:sequence> 
     <xs:element name="AreaCode"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[0-9]+" /> 
        <xs:maxLength value="3" /> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     <xs:element name="LocalNumber"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[0-9]+" /> 
        <xs:minLength value="7" /> 
        <xs:maxLength value="17" /> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     <xs:element name="Extension" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[0-9]+" /> 
        <xs:maxLength value="5" /> 
       </xs:restriction> 
      </xs:simpleType>     
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

首先我想這使AREACODE optionnal特定情況:

  <xs:element name="PhoneNumberWithOptionalAreaCode"> 
      <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="PhoneNumberType"> 
        <xs:sequence> 
         <xs:element name="AreaCode" type="xs:string" minOccurs="0" /> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
      </xs:complexType> 
     </xs:element> 

它給了我一個錯誤,指出有相同名稱的元素應該有相同的類型。

所以,我想這一點:

<xs:complexType name="PhoneNumberType"> 
    <xs:sequence> 
     <xs:element name="AreaCode" type="AreaCodeType" /> 
     <xs:element name="LocalNumber"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[0-9]+" /> 
        <xs:minLength value="7" /> 
        <xs:maxLength value="17" /> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     <xs:element name="Extension" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[0-9]+" /> 
        <xs:maxLength value="5" /> 
       </xs:restriction> 
      </xs:simpleType>     
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:simpleType name="AreaCodeType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[0-9]+" /> 
     <xs:maxLength value="3" /> 
    </xs:restriction> 
</xs:simpleType> 

    <xs:element name="PhoneNumberWithOptionalAreaCode"> 
     <xs:complexType> 
     <xs:complexContent> 
      <xs:extension base="PhoneNumberType"> 
       <xs:sequence> 
        <xs:element name="AreaCode" type="AreaCodeType" minOccurs="0" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 

現在XSD是有效的,但是當我嘗試驗證以下XML它說,預計不會LocalNumber,預計AREACODE。

<PhoneNumberWithOptionalAreaCode> 
    <LocalNumber>1234567</LocalNumber> 
</PhoneNumberWithOptionalAreaCode> 

任何人都可以幫忙嗎?

謝謝!

回答

0

不能使用既不擴展/限制作出強制性元素在較低的層次結構可選。查看XML Schema規範更多內容:Restriction

唯一可能的解決將反轉層次,如果你有控制權。讓PhoneNumberWithOptionalAreaCode爲基礎,具有PhoneNumberType延長PhoneNumberWithOptionalAreaCode