XML架构:在选择元素中使用复杂类型?

问题描述:

在定义模式时我看到所有使用<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 

大致相当。

是的,有可能这样做。我只是通过“眼睛”来检查它,但对我来说看起来还不错。

我不知道Haskell,但我不认为效果是一样的。在您的XSD中,您已将Shape定义为包含Circle或Rectangle作为子元素的元素。如果要定义圆形和矩形作为替代的形状(这听起来更合理的设计),那么你应该:

  • 定义与abstract="true"
  • 形状定义圆圈substitutionGroup="Shape"
  • substitutionGroup="Shape"定义矩形