初始化扩展中的枚举 复杂使用 xsd 在抽象类中键入

本文关键字:xsd 抽象类 扩展 枚举 复杂 初始化 | 更新日期: 2023-09-27 18:35:31

<xs:simpleType name="Gender">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Male"/>
        <xs:enumeration value="Female"/>
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="Client"
                abstract="true">
    <xs:attribute name="LastName"
                  type="xs:string"
                  use="optional"/>
    <xs:attribute name="FirstName"
                  type="xs:string"
                  use="optional"/>
    <xs:attribute name="Gender"
                  type="Gender"
                  use="required"/>
</xs:complexType>
<xs:complexType name="MaleClient">
    <xs:complexContent>
        <xs:extension base="Client">
            <xs:attribute name="Gender"
                          type="Gender"
                          use="required"
                          fixed="Male"/>
            <xs:attribute name="NewMaleProperty"
                          type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="FemaleClient">
    <xs:complexContent>
        <xs:extension base="Client">
            <xs:attribute name="Gender"
                          type="Gender"
                          use="required"
                          fixed="Female"/>
            <xs:attribute name="NewFemaleProperty"
                          type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

我有一个抽象类(Client),我将该类扩展到两个子类(MaleClient和FemaleClient)。

当我使用当前架构生成类时,会生成一个名为"Gender1"的新属性。我想做的是将MaleClient和FemaleClient的性别初始化为各自的值。

我怎样才能做到这一点?

初始化扩展中的枚举 复杂使用 xsd 在抽象类中键入

您当前的定义是尝试在一个步骤中组合一个限制(关于性别属性)和一个扩展(添加新属性)。 这不仅会在绑定工具中产生您不喜欢的结果,还会使架构不符合要求。

如果将这两个更改分为两个派生步骤,会发生什么情况?

<xs:complexType name="MaleClient-0">
  <xs:complexContent>
    <xs:restriction base="Client">
      <xs:attribute name="Gender"
        type="Gender"
        use="required"
        fixed="Male"/>
    </xs:restriction>      
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="MaleClient">
  <xs:complexContent>
    <xs:extension base="MaleClient-0">
      <xs:attribute name="NewMaleProperty"
        type="xs:string"/>
    </xs:extension>      
  </xs:complexContent>
</xs:complexType>

最好使中间类型匿名,但这似乎是不可能的(XSD 表面语法中的另一个缺陷)。