所以有2个选择。
选项 A 是最简单的方法,即将第一个 XSD 包含或导入到第二个 XSD 中,然后将第一个属性组包含在您定义的新属性组中。
对于选项 A,以下是 XSD 的完整 XML 和示例 XML:
第一个.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:attributeGroup name="myAttributes">
<xs:attribute name="name" type="name_t" use="required"/>
<xs:attribute name="age" type="age_t" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="name_t">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="age_t">
<xs:restriction base="xs:int"/>
</xs:simpleType>
</xs:schema>
第二个.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:include schemaLocation="First.xsd"/>
<xs:attributeGroup name="extendedMyAttributes">
<xs:attributeGroup ref="myAttributes"/>
<!-- New attribute -->
<xs:attribute name="gender" type="xs:string"/>
</xs:attributeGroup>
</xs:schema>
现在您可以在元素定义中使用新的扩展属性组:
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="extendedMyAttributes"/>
</xs:complexType>
</xs:element>
示例 XML 将如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Second.xsd"
gender="male" name="Adam" age="20">
</person>
这样就可以验证了。
选项 B 将覆盖 myAttributes 属性组的现有定义,而不使用
<xs:override>
元素创建具有新名称的新属性组。这允许您继续将属性组引用为 myAttributes,而不是新名称。
这是覆盖 myAttributes 的架构。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:override schemaLocation="First.xsd">
<xs:attributeGroup name="myAttributes">
<xs:attribute name="name" type="name_t"/>
<xs:attribute name="age" type="age_t"/>
<!-- New gender attribute -->
<xs:attribute name="gender" type="xs:string"/>
</xs:attributeGroup>
</xs:override>
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="myAttributes"/>
</xs:complexType>
</xs:element>
</xs:schema>
因为您只是向现有组添加新属性(并保留第一个组的属性),所以只需创建一个包含第一个属性组的新属性组就足够了。
比较这两个选项,选项 A 也“更安全”,从某种意义上说,如果第一个架构的新版本更新,您可以参考更新的 XSD 并保留原始属性组中的任何新的或更新的属性。使用选项 B,除了新的
name
属性之外,您还必须复制覆盖的属性组定义中的 age
和 gender
属性。
当您想要执行完全重命名、删除属性等操作时,您可能会想要覆盖某些内容。唯一基本保持不变的是属性组的名称。
您可以阅读有关覆盖的更多信息:https://www.w3.org/TR/xmlschema11-1/#override-schema