如何使 XSD 选择明确(唯一粒子属性 - UPA)?

How to make XSD choice unambiguous (Unique Particle Attribution - UPA)?

我见过其他类似的旧问题,但 none 有实际解决方案。我有以下架构:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="p1">
        <xs:complexType>
          <xs:choice>
            <xs:sequence>
              <xs:element name="el1" type="xs:string"/>
              <xs:element name="el2" type="xs:string"/>
            </xs:sequence>
            <xs:sequence>
              <xs:element name="el2" type="xs:string"/>
              <xs:element name="el1" type="xs:string"/>
            </xs:sequence>
            <xs:element name="el1" type="xs:string"/>
            <xs:element name="el2" type="xs:string"/>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>

结果我得到以下错误:

el1 and el1 (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.

我知道这意味着模式在某种程度上是不明确的,但我不明白为什么。据我了解,上面的架构应该意味着 Either an el1 followed by an el2, an el2 followed by an el1, an el1,或 el2. 如果情况确实如此,那么我不明白在不清楚我们处于这三种情况中的哪一种情况下会出现这种情况。

如果您有替代方案完全我上面描述的应该发生的事情,我愿意接受。

在这种情况下,可以将 xsd:choice 可能性重新排列为逻辑上等价的形式,从而可以明确地在第一个 el1el2 元素出现时立即应用哪个选择已解析 没有先行 :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="p1">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="el1" type="xs:string"/>
          <xs:element name="el2" type="xs:string" minOccurs="0"/>
        </xs:sequence>
        <xs:sequence>
          <xs:element name="el2" type="xs:string"/>
          <xs:element name="el1" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>