2013-08-25 70 views
1

在定義模式時我看到所有使用<xs:choice>的示例中,元素始終是簡單元素,它們可能會引用某些外部類型,但從不具有它們自己的子元素。這是一個規則還是一個慣例?例如,是否有可能做到這一點?XML架構:在選擇元素中使用複雜類型?

<xs:element name="shape"> 
    <xs:complexType> 
    <xs:choice> 
     <xs:element name="circle"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="radius" type="xs:decimal" /> 
      <xs:element name="x" type="xs:integer" /> 
      <xs:element name="y" type="xs:integer" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     <xs:element name="rectangle"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="length" type="xs:integer" /> 
      <xs:element name="width" type="xs:integer" /> 
      <xs:element name="x" type="xs:integer" /> 
      <xs:element name="y" type="xs:integer" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:choice> 
    </xs:complexType> 
</xs:element> 

這將是在Haskell寫

data Shape = Circle Double Int Int 
      | Rectangle Int Int Int Int 

大致相當。

回答

1

是的,有可能這樣做。我只是通過「眼睛」來檢查它,但對我來說看起來還不錯。

我不知道Haskell,但我不認爲效果是一樣的。在您的XSD中,您已將Shape定義爲包含Circle或Rectangle作爲子元素的元素。如果要定義圓形和矩形作爲替代的形狀(這聽起來更合理的設計),那麼你應該:

  • 定義與abstract="true"
  • 形狀定義圓圈substitutionGroup="Shape"
  • substitutionGroup="Shape"定義矩形
相關問題