XSD的sequence能否包含两个同名子元素?所给XSD片段是否合法
XSD的xsd:sequence节点下能否包含两个同名xsd:element子元素?
核心结论
你提供的XSD片段属于不符合W3C XSD规范的无效写法,是Schema编写错误,不存在“合法且用于要求元素按2的倍数重复”的可能性。
涉及的XSD规则说明
你不需要纠结是参考complexType规则还是粒子规则,判定这个问题的核心依据是XSD规范中明确要求的唯一粒子归属约束(Unique Particle Attribution, UPA):
- 该约束要求:当XSD处理器校验XML实例内容时,读到任意一个元素节点,都可以不经过回溯,唯一确定它匹配内容模型(sequence/choice/all等分组)中的哪一个粒子(元素声明、分组引用、通配符都属于粒子)。
- 你贴出的片段中,
xsd:sequence下两个同级的xsd:element都命名为beUsageRef、类型完全一致,当处理器读到实例中的beUsageRef节点时,完全无法判断它应该匹配第一个还是第二个元素声明,直接触发UPA违规。
常见认知偏差纠正
- 不存在“complexType的每个子元素必须唯一命名”的泛化规则,约束仅作用于同级别内容模型下的粒子,不同层级、不同命名空间下完全可以存在同名元素。
- 如果要实现“元素必须出现2次/按固定次数重复出现”的效果,正确的XSD写法是给单个
xsd:element配置minOccurs和maxOccurs属性,例如要求必须连续出现2次beUsageRef的合法写法如下:
<xsd:sequence minOccurs="0"> <xsd:element name="beUsageRef" type="breakdownElementUsageInBreakdownRef" minOccurs="2" maxOccurs="2"/> </xsd:sequence>
- 无论是XSD 1.0还是XSD 1.1版本,都不允许同级别内容模型下出现两个同名、同目标命名空间的明确元素声明,XSD 1.1仅放松了通配符和元素粒子冲突的判定规则,这类重复明确元素的写法始终属于违规。
你提供的问题XSD片段
<xsd:complexType name="breakdownElementStructureRef"> <xsd:sequence minOccurs="0"> <xsd:element name="beUsageRef" type="breakdownElementUsageInBreakdownRef"/> <xsd:element name="beUsageRef" type="breakdownElementUsageInBreakdownRef"/> </xsd:sequence> <xsd:attribute name="uidRef" use="optional"> <xsd:simpleType> <xsd:restriction base="uidRef"> <xsd:pattern value="bes[1-9][0-9]*"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="uriRef" type="xsd:anyURI" use="optional"/> <xsd:assert test="(@uidRef and not(beUsageRef) and not(@uriRef)) or (not(@uidRef) and beUsageRef and not(@uriRef)) or (not(@uidRef) and not(beUsageRef) and @uriRef)"/> </xsd:complexType>
所有符合标准的XSD处理器加载这段Schema时都会抛出校验错误,无法完成Schema的解析编译。
内容的提问来源于stack exchange,提问作者WaiverWireAddict
相关产品推荐
相关产品推荐

