1

在定义模式时使用的所有示例中<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

在哈斯克尔。

4

1 回答 1

1

是的,有可能做到这一点。我只是“通过眼睛”检查了它,但对我来说看起来还可以。

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

  • 定义形状abstract="true"
  • 定义圆substitutionGroup="Shape"
  • 定义矩形substitutionGroup="Shape"
于 2013-08-25T08:22:44.263 回答