You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子XSD中修改父XSD继承元素的自定义类型?

修改父XSD继承元素类型的解决方案

问题背景

需要在子XSD中修改父XSD里Data类型下LINE2元素的类型,将其从Str20改为Str30m1,但现有尝试均报错:

  • 使用extension时,出现元素重复类型冲突错误
  • 使用restriction时,出现粒子映射不完整错误

父XSD片段

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:simpleType name="Str30m1">
    <xs:restriction base="xs:string">
        <xs:maxLength value="30"/>
        <xs:minLength value="1"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="Str20">
    <xs:restriction base="xs:string">
        <xs:maxLength value="20"/>
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="Data">
    <xs:sequence>
            <xs:element name="LINE1" type="Str30m1" minOccurs="0"/>
            <xs:element name="LINE2" type="Str20" minOccurs="0"/>
            <xs:element name="LINE3" type="Str20" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="Common_dataType">
<xs:element name="Details">
    <xs:complexType>
    <xs:sequence>   
    <xs:element name="Values" type="Data"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:complexType>
</xs:schema>

错误的子XSD尝试

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:redefine schemaLocation="parent.xsd">
    <xs:complexType name="Data">
    <xs:complexContent>
    <xs:extension base="Data">
    <xs:sequence>
        <xs:element name="LINE2" type="Str30m1" minOccurs="0"/>
    </xs:sequence>
    </xs:extension>
    </xs:complexContent>
</xs:complexType>
</xs:redefine>
<xs:element name="Common_Data" type="Common_dataType"/>
</xs:schema>

报错信息

  • 使用extension时:
    cos-element-consistent: Error for type 'Data'. Multiple elements with name 'LINE2', with different types, appear in the model group.
    
  • 使用restriction未完整定义粒子时:
    rcase-Recurse.2: There is not a complete functional mapping between the particles
    

正确解决方案

使用xs:redefine结合xs:restriction,完整重定义Data类型的所有序列元素,仅修改LINE2的类型,同时保证其他元素的定义与父类完全一致(包括名称、类型、出现次数等),这样才能满足XML Schema的粒子映射规则。

正确的子XSD代码

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
    <xs:redefine schemaLocation="parent.xsd">
        <xs:complexType name="Data">
            <xs:complexContent>
                <xs:restriction base="Data">
                    <xs:sequence>
                        <!-- 保留父类LINE1的定义 -->
                        <xs:element name="LINE1" type="Str30m1" minOccurs="0"/>
                        <!-- 修改LINE2的类型为Str30m1 -->
                        <xs:element name="LINE2" type="Str30m1" minOccurs="0"/>
                        <!-- 保留父类LINE3的定义 -->
                        <xs:element name="LINE3" type="Str20" minOccurs="0"/>
                    </xs:sequence>
                </xs:restriction>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>
    <xs:element name="Common_Data" type="Common_dataType"/>
</xs:schema>

说明

  • extension的作用是在原类型基础上添加新元素/属性,而非修改已有元素,所以会导致重复的LINE2元素,引发冲突。
  • 使用restriction时,必须完整复现原类型的所有粒子(序列中的所有元素),仅修改需要调整的部分,这样才能保证父类型和子类型之间的粒子映射完整,符合Schema的约束规则。

内容的提问来源于stack exchange,提问作者robertoonn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:50:11