2012-12-19 64 views
10

我在我的公司創建了一個新的dataexchange服務。我們想擴展在我們的core.xsd定義文件中定義的現有對象。這裏是我需要做的一個例子:如何重寫父/擴展元素內部的Xsd元素

<xs:complexType name="parentType"> 
    <xs:sequence> 
    <xs:element name="departmentName" type="core:DEPARTMENT_NAME" 
       minOccurs="0" maxOccurs="1" />  
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="childType"> 
    <xs:complexContent> 
    <xs:extension base="parentType"> 
     <xs:sequence> 
     <xs:element name="departmentName" 
        type="core:DEPARTMENT_NAME" 
        minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

我認爲這很有道理。我想覆蓋父元素並使其成爲必需元素。但是,一個有效的XML文件就是這樣。現在哪裏有一個額外的部門名稱!?

<childType> 
    <departmentName>HR</departmentName> 
    <departmentName>IT</departmentName> 
</childType> 

我怎麼能做到這一點,這樣的XML文件將成爲:

<childType> 
    <departmentName>IT</departmentName> 
</childType> 

謝謝, 克雷格

回答

7

您需要使用的限制,而不是延伸。這將是您指定場景的完整有效模式(我已經寬鬆地使用名稱空間來使其有效)。

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:core="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="parentType"> 
     <xs:sequence> 
      <xs:element name="departmentName" type="core:DEPARTMENT_NAME" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="childType"> 
     <xs:complexContent> 
      <xs:restriction base="parentType"> 
       <xs:sequence> 
        <xs:element name="departmentName" type="core:DEPARTMENT_NAME"/> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:simpleType name="DEPARTMENT_NAME"> 
     <xs:restriction base="xs:string"/> 
    </xs:simpleType> 

    <xs:element name="childType" type="childType"/> 
</xs:schema> 
+0

感謝Petru,那就是我一直在尋找的東西。問題雖然:如果我仍然想擴展parentType會發生什麼?假設我想爲擴展它的類型添加一些缺失的字段。我注意到你只能限制或擴展,但不能同時爲父類型。我會嘗試,但是是否需要創建一個擴展childType的grandChild類型,該類型對parentType有限制?這似乎過於冗長和繁瑣,是不是一個更清潔的解決方案? – Craig

+1

爲了構建childType的頂部,您必須創建grandchildType。我同意這看起來很麻煩 - 尤其是維護xsd:限制......但這就是XSD 1.0。至於「更清潔」的限定詞...它真的在細節中,而且是旁觀者的眼睛。如果這是一個新的設計,我相信有不同的方式來佈局你的層次結構,以便它給你合理的東西......你還必須考慮XSD的代碼綁定... –