如何修正XSD1.0中带固定属性的同名choice元素Schema?
问题分析与修正方案
警告原因
你收到的The type attribute cannot be present with either simpleType or complexType警告,是因为XSD规则禁止在<xs:element>标签中同时使用type属性和内嵌的<xs:complexType>定义——二者只能选其一:要么通过type引用已定义的类型,要么直接在内嵌的<xs:complexType>中定义元素结构。
同时原XSD中的choiceType基于xs:boolean的simpleContent设计,和你实际的XML(空的<choice>元素)不匹配,也会导致验证失败,需要一并修正。
修正方案(符合XSD1.0+固定属性需求)
方案1:直接内嵌固定属性的元素定义
这种方式适合不需要复用类型的场景,直接为每个<choice>元素定义带固定属性的空内容结构:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="XMLSchema2" targetNamespace="http://tempuri.org/XMLSchema2.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="choices"> <xs:complexType> <xs:sequence> <!-- 第一个choice,固定所有属性值 --> <xs:element name="choice"> <xs:complexType> <xs:sequence/> <!-- 定义空内容,匹配XML中的空元素 --> <xs:attribute name="id" type="xs:string" fixed="c1" use="required"/> <xs:attribute name="text" type="xs:string" fixed="text 1" use="required"/> <xs:attribute name="isCommentRequired" type="xs:boolean" fixed="true" use="required"/> <xs:attribute name="description" type="xs:string" fixed="description1" use="required"/> </xs:complexType> </xs:element> <!-- 第二个choice,固定所有属性值 --> <xs:element name="choice"> <xs:complexType> <xs:sequence/> <xs:attribute name="id" type="xs:string" fixed="c2" use="required"/> <xs:attribute name="text" type="xs:string" fixed="text 2" use="required"/> <xs:attribute name="isCommentRequired" type="xs:boolean" fixed="false" use="required"/> <xs:attribute name="description" type="xs:string" fixed="description2" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
方案2:定义命名类型复用(推荐)
如果后续需要复用类似的固定属性结构,可以为每个固定属性组合定义单独的命名类型,再在元素中引用:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="XMLSchema2" targetNamespace="http://tempuri.org/XMLSchema2.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <!-- 对应id=c1的固定属性类型 --> <xs:complexType name="choiceTypeC1"> <xs:sequence/> <xs:attribute name="id" type="xs:string" fixed="c1" use="required"/> <xs:attribute name="text" type="xs:string" fixed="text 1" use="required"/> <xs:attribute name="isCommentRequired" type="xs:boolean" fixed="true" use="required"/> <xs:attribute name="description" type="xs:string" fixed="description1" use="required"/> </xs:complexType> <!-- 对应id=c2的固定属性类型 --> <xs:complexType name="choiceTypeC2"> <xs:sequence/> <xs:attribute name="id" type="xs:string" fixed="c2" use="required"/> <xs:attribute name="text" type="xs:string" fixed="text 2" use="required"/> <xs:attribute name="isCommentRequired" type="xs:boolean" fixed="false" use="required"/> <xs:attribute name="description" type="xs:string" fixed="description2" use="required"/> </xs:complexType> <xs:element name="choices"> <xs:complexType> <xs:sequence> <xs:element name="choice" type="choiceTypeC1"/> <xs:element name="choice" type="choiceTypeC2"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
关键说明
- 两种方案都满足XSD1.0规范,且通过
fixed属性强制XML中的对应属性值不可修改,修改会导致验证失败。 - 使用
<xs:sequence/>定义空内容元素,匹配你提供的XML中<choice>元素无内容的结构。 - 添加
use="required"确保XML必须包含所有指定属性,和你的示例XML结构一致。
内容的提问来源于stack exchange,提问作者Raviraj Bhalerao
相关产品推荐
相关产品推荐

