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"
定义矩形