为XSD的<all>类型添加属性时出现编译无效问题求助
XSD中使用
<xs:all>时添加属性的问题解决及差异说明 问题原因
你的XSD编译失败是因为属性声明必须放在内容模型(如<xs:all>、<xs:sequence>)之后。当前<trade>元素的complexType中,你把<xs:attribute>放在了<xs:all>前面,这违反了XSD语法规则——在complexType内部,定义子元素结构的内容模型必须先于属性声明。
<xs:sequence>与<xs:all>的核心差异
<xs:sequence>:要求子元素严格按声明顺序出现,子元素的maxOccurs可设为任意正整数(包括unbounded)。<xs:all>:允许子元素以任意顺序出现,但XSD 1.0有严格约束:每个子元素的maxOccurs只能是0或1(不能设为unbounded);且<xs:all>只能作为complexType的直接内容模型,不能嵌套在其他内容模型中(XSD 1.1放宽了部分限制)。
修复后的XSD代码
将<trade>元素中的<xs:attribute>移到<xs:all>之后即可,修复后的完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="positionList"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="positions"> <xs:complexType> <xs:all> <xs:element name="Details"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="AccountDetails"> <xs:complexType> <xs:all> <xs:element name="PK_Position" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="trade"> <xs:complexType> <xs:all> <xs:element name="amount" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="lot" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> </xs:all> <xs:attribute name="crypto" type="xs:string" use="required" /> </xs:complexType> </xs:element> <xs:element name="openingHours"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="day"> <xs:complexType> <xs:all> <xs:element name="day" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="open1" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="close1" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="open2" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="close2" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="idBrokerList"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="idBrokerList"> <xs:complexType> <xs:all> <xs:element name="brokerName" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="margin" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="capital" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> <xs:element name="margin_free" minOccurs="1" maxOccurs="1" nillable="true" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
额外注意事项
如果需要<trade>元素在<xs:all>内部出现多次,XSD 1.0不允许——<xs:all>的子元素maxOccurs只能是0或1。若必须支持多实例,可选择两种方案:
- 升级到XSD 1.1,它允许为
<xs:all>的子元素设置maxOccurs="unbounded"; - 将
<trade>元素包裹在<xs:sequence>中,再将该<xs:sequence>放入<xs:all>内。
内容的提问来源于stack exchange,提问作者the_driver
相关产品推荐
相关产品推荐

