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

为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。若必须支持多实例,可选择两种方案:

  1. 升级到XSD 1.1,它允许为<xs:all>的子元素设置maxOccurs="unbounded";
  2. 将<trade>元素包裹在<xs:sequence>中,再将该<xs:sequence>放入<xs:all>内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:17:04