如何通过添加新属性来扩展属性组?

问题描述 投票:0回答:1
xsd
1个回答
0
投票

所以有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

© www.soinside.com 2019 - 2024. All rights reserved.