2013-01-07 68 views
1

嵌套XSD存在問題。我有我的文檔結構的MAIN文件具有相同的HEADer(我想保持它分開 - 工作良好),我想有幾個機構,取決於其內容。 我的問題是如何以適當的方式連接它?嵌套XSD定義

MAIN.XSD:

<xs:schema id="MAIN" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns=""> 
    <xs:include schemaLocation="HEAD.xsd"/> 

    <xs:element name="MAIN"> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
     <xs:element name="HEAD" type="HEADType"/> 
     <xs:element name="BODY" type="BODYType"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

HEAD.XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="HEAD" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" > 
    <xs:complexType name="HEADType"> 
    <xs:all minOccurs="1" maxOccurs="1"> 
     <xs:element name="USER"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:pattern value="[A-Z_]+"></xs:pattern> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
    </xs:all> 
    </xs:complexType> 
</xs:schema> 

想法,我有如下:

  1. 使 「MAIN」 在MAIN.xsd類型MAINTYPE的元素,然後將MAIN.XSD包含到已定義BODYType的BODY_CUSTOMER中。
  2. 單獨加載MAIN.xsd和BODY_CUSTOMER.xsd,然後它會找到BODYType的定義。

但是,我不認爲這是做到這一點的「正確」方式。

+0

對HEAD和BODY使用相同的文件! ..在HEAD.XSD中將BODYType並行定義爲HEADType(將其重命名爲HEADBODY.XSD) –

回答

2

根據您的描述,您試圖執行的內容通俗地稱爲「懸掛定義」。

這種方法的最常見的問題是典型的XSD模式編輯器會抱怨缺少defitions當你試圖編輯Main.xsd

你的第一個想法是怎麼樣的混亂;不過,我認爲這不是必要的,因爲第二個是你真正需要做的。我認爲,雖然separately指的是文件是不同的,你必須在同一時間加載它們。如何做到這一點取決於需要使用XSD的工具,所以我無法真正幫助您。

假設.NET,如果您在一個XmlSchemaSet對象中一次加載3個XSD文件(Main,Head和Body_Customer),它將按照您的需要工作。

至於「正確」......這一切都取決於您的組織中接受或不接受的XSD實踐。就我而言,懸掛類型是完全有效的XSD設計模式。

+0

感謝您的回覆。我認爲有一些方法可以連接我一無所知的xsd文件;) –