2009-08-04 48 views
1

我正在尋找我的XML模式(XSD)的最佳解決方案。如何實現派生響應(XSD)?

我有一個response

<xs:element name="exampleCatalogResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="meta" type="tns:metaType" /> 
      <xs:element name="data" type="tns:defaultDataType" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

...的defaultDatatype

<xs:complexType name="defaultDataType"> 
    <xs:sequence> 
     <xs:element name="catalog"> 
      <xs:complexType> 
       <xs:sequence maxOccurs="unbounded"> 
        <xs:element name="catalogItem" type="tns:catalogItem" /> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="itemIdConstraint"> 
       <xs:selector xpath="tns:catalogItem" /> 
       <xs:field xpath="tns:id" /> 
      </xs:unique> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

...和catalogItem

<xs:complexType name="catalogItem"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:nonNegativeInteger" /> 
    </xs:sequence> 
</xs:complexType> 

...但現在有一個專門的項目catalogItem

<xs:complexType name="specialItem"> 
    <xs:complexContent> 
     <xs:extension base="tns:catalogItem"> 
      <xs:sequence> 
       <xs:element name="code" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

現在我需要爲我的specialItem專門Response回答其預計這一specialItem請求。

如何才能認識到這一點,而無需另外編寫defaultDataType,其中只有catalogItem的類型更改爲tns:specialItem

+0

這不是嚴格有必要縮進八。 – 2009-08-04 12:47:39

回答

0

感謝您的竅門13ren,

我用涵攝功能。因此,默認的catalogItem也被用於獨特的表達式。現在如果我在xml中使用這個,我可以通過類型指定這個。

<tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>0</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>1</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem> 
    <tns:id>2</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 

所以最後一個項目是默認的,上面兩個是專門的項目。這對我很好。

1

我不認爲你可以在XSD中強制執行共同發生的約束。在一個謎方案的精神,這裏是一個尷尬的方式讓你想要的變化副本,而無需手動「寫另一defaultDataType」:

  1. 定義模式文檔在上面的複合類型沒有命名空間。

  2. <include>它在第二個模式文檔中,它有一個名稱空間 - 這給它的名稱空間。我們可以在許多模式文檔中做到這一點,每次在不同的名稱空間中獲取副本。

  3. 在這些模式文檔中的每一個擴展catalogItem,以便每個擴展將在其自己的命名空間。

  4. 在最終的模式文檔中,包含上述所有內容,並使它們可以替代 - 因此它們都可以用作響應。 (或者,你可以讓它們在另一個模式中擴展一些其他Response元素)。

  5. 注意:您將需要一種不同的方式來執行itemIdConstraint約束,該約束通過名稱空間。不速之客,我不知道這是否可能。

這是通過使defaultDataType的不同副本各一個,如果你真正希望他們都這麼行不通使用相同的defaultDataType。就像我說的那樣,它很尷尬,但這是我能看到做你想做的唯一方法。我提供它作爲一種謎題解決方案,而不是實際的解決方案!

相關問題