XML Schema:在choice元素中使用复杂类型?

时间:2013-08-25 00:28:07

标签: xml schema choice

在我定义模式时使用<xs:choice>看到的所有示例中,元素始终是简单元素,可以引用某些外部类型,但从不拥有自己的子元素。这是一项规则,还是一项惯例?例如,是否可以这样做?

<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>

这大致相当于写作

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

在Haskell。

1 个答案:

答案 0 :(得分:1)

是的,可以这样做。我只是通过眼睛&#34;检查它&#34;但它看起来还不错。

我不了解Haskell,但我认为效果不一样。在XSD中,您已将Shape定义为包含Circle或Rectangle作为子元素的元素。如果你想将Circle和Rectangle定义为可替换Shape(这听起来更合理的设计),那么你应该:

  • 使用abstract="true"
  • 定义Shape
  • 使用substitutionGroup="Shape"
  • 定义Circle
  • 使用substitutionGroup="Shape"
  • 定义矩形