如何允许 XSD 中无序元素的交错?

How to allow interleaving of unordered elements in XSD?

我必须编写一个模式,其中嵌套元素的顺序无关紧要,并且可以有更多相同类型的嵌套元素。

我尝试使用 xs:allxs:sequence,但它不起作用。

这个XML应该是有效的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="test.xsd">
    <elementB>B</elementB>
    <elementA>A</elementA>
    <elementA>A</elementA>
</test>

这是我试过的 XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="test">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="elementA" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elementB" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

第一个 XSD 架构有排序问题。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           vc:minVersion="1.1">
    <xs:element name="test">
        <xs:complexType>
            <xs:all>
                <xs:element name="elementA" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elementB" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

第二个 XSD 看起来很有前途,但我无法设置 Intellij 以将其正确用于 XML。 (我在这里切换了 XML Schema 1.1 File->Settings->Languages & Frameworks->Schemas and DTDs->Default XML Schemas)我的 IntelliJ 版本是 2019.2.3.

显然 XSD 的 xs:sequence 版本强加了一个顺序。

XSD 的 xs:all 版本使用 xs:all/xs:element[@maxOccurs="unbounded"],这需要 XSD 1.1。

XML Oxygen 成功验证了你的 XML 与你的 xs:all XSD。

IntelliJ 有 XSD 1.1 支持,但可能不完整,或者这里的规范不明确——现在没时间研究。

但是,如果您的实际案例与您发布的案例一样简单,您可以使用 xs:choice 实现顺序独立性,而不依赖于 XSD 1.1:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.0">
  <xs:element name="test">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="elementA" type="xs:string"/>
        <xs:element name="elementB" type="xs:string"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

希望这能让您解决任何可能阻碍您的 IntelliJ 问题。

你的第二个模式("promising" 一个)对我有用。在 oXygen 中试过,效果很好。恐怕我不知道如何为 XSD 1.1 验证设置 IntelliJ。

如果固定集合(A、B、C...)中的任何元素可以出现任意次数,则您不需要 XSD 1.1:您可以将内容模型编写为

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="A">
  <xs:element name="B">
  <xs:element name="C">
</xs:choice>