如何在子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
相关产品推荐
相关产品推荐

