当然,您可以在新列表中创建新元素。但是,不能向后兼容原始模式。我们的目标是在保持向后兼容性的同时实现一个可扩展的列表(参阅 参考资料)。
对于本文的目标,这里作出的假设基于我与客户打交道的经验 —— 即用附加值扩展现有枚举列表的需求。另外,我假设在一个步骤内完成 XML 模式解析与验证等操作。
扩展枚举列表的必要条件
该扩展示例有四个必要条件:
允许在设计阶段之后扩展枚举列表。
用解析器验证枚举列表。
在一个周期内验证枚举列表。
维持和原始模式的向后兼容性。
举例来说,一个团队需要处理一个区域产业协会的枚举列表(或任意现有列表)为例,并根据使用修改模式组件。先前的模式提供 MaritalStatus 组件和值的枚举列表,如 清单 1 所示。
清单 1. 婚姻状况枚举列表
<xsd:simpleType name="MaritalStatusEnumType">
<xsd:restriction base="xsd:normalizedString">
<xsd:enumeration value="Divorced"/>
<xsd:enumeration value="Married"/>
<xsd:enumeration value="NeverMarried"/>
<xsd:enumeration value="Separated"/>
<xsd:enumeration value="SignificantOther"/>
<xsd:enumeration value="Widowed"/>
<xsd:enumeration value="Unknown"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="MaritalStatus" type="MaritalStatusEnumType"/>
假设一个公司要使用这些值,另外,还要支持它的重要贸易伙伴使用另一个值。CivilUnion 是一个扩展值,公司识别出该值不属于原始模式。但是从语义上来说,使用现有元素 —MaritalStatus — 也是可以的。公司要如何实现呢?
回页首
解决方案 1: 编辑原始模式使其包含新枚举值
当然,编辑原始模式使其包含新枚举值是最直接的方法。保留模式的本地副本,然后编辑这些模式以支持公司使用的枚举值。
优点:易于实现
缺点:
需要编辑原始模式,这些模式将逐渐改变,以至于无法控制。如果扩展一个先前存在的列表,那么创建者(贸易伙伴、协会等)可能要发布列表的新版本。您需要将编辑的内容传播到每个新版本中。
手动编辑模式会导致意外的编辑错误。
如果您不能(或不想)编辑原始模式,则需要一种替代方法。
回页首
解决方案 2: 创建新枚举列表并加入到原始列表中
第二个选择是创建新枚举列表,并将其加入到原始枚举列表中。清单 1 显示原始婚姻状况列表。清单 2 显示最新创建的枚举列表。
清单 2. 新婚姻状况枚举列表
<xsd:simpleType name="MyExtMaritalStatusEnumType">










