XSD中通过限制xs:integer定义带属性空元素报错原因咨询
错误原因
你遇到的报错src-ct.1: Complex Type Definition Representation Error,核心原因是**xs:complexContent的base属性要求必须指向一个complexType类型**,但你代码里指定的xs:integer是simpleType,违反了XML Schema的语法规则。
XML Schema中,complexContent的作用是扩展或限制复杂类型的内容模型——它只能基于已有的complexType来修改,不能直接作用于simpleType。你试图通过它限制xs:integer(简单类型),同时添加属性,这本身就不符合语法规范。
两种方法的差异
无效的第一种方法
你尝试的代码错误地将simpleType作为complexContent的基类型:
<xs:element name="product"> <xs:complexType> <xs:complexContent> <xs:restriction base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element>
这里的逻辑矛盾在于:如果元素要基于xs:integer(简单类型),它本身应该是simpleType,但simpleType元素不能拥有属性,只有complexType元素可以带属性。你试图用complexContent把simpleType转成complexType的思路本身不成立,因为complexContent只接受complexType作为基类。
有效的第二种方法
直接定义空的complexType并添加属性,是XML Schema中定义带属性的空元素的标准方式:
<xs:element name="product"> <xs:complexType> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType> </xs:element>
这种方式下,product是一个没有内容的complexType元素,天然支持添加属性,完全符合Schema的语法规则,所以可以正常工作。
补充说明
如果你的需求是让元素既拥有类似integer的简单值,又带属性,正确的做法是使用xs:simpleContent来扩展或限制simpleType,同时添加属性。示例代码如下:
<xs:element name="product"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
这种方式下,product元素可以包含integer类型的文本值,同时拥有prodid属性,满足兼具简单值和属性的需求。
内容的提问来源于stack exchange,提问作者nespapu

