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

Xml 如何使XSD选择明确(唯一粒子属性-UPA)?,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我见过其他类似的老问题,但都没有实际的解决方案。我有以下模式: <?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>

我见过其他类似的老问题,但都没有实际的解决方案。我有以下模式:

    <?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和el1(或其取代基中的元素)违反 “独特粒子属性”。在针对此架构进行验证期间, 这两个粒子会产生歧义

我知道这意味着模式在某种程度上是不明确的,但我不知道怎么做。根据我的理解,上面的模式应该是指
el1
后接
el2
el2
后接
el1
el1
,或
el2
。如果真的是这样的话,那么我看不出在这三种情况中我们所处的哪一种情况下会出现什么情况


如果您有一个替代方案,它完全符合我上面描述的情况,我对此持开放态度。

在这种情况下,可以将
xsd:choice
可能性重新安排为逻辑上等价的形式,以便在解析第一个
el1
el2
元素时,在不进行前瞻性分析的情况下,明确应用哪个选项:



UPA的关键不在于模式必须是明确的,而在于它必须是明确的,没有前瞻性。一旦看到el1元素,您就必须知道选择哪个分支,而不必看接下来会发生什么。对于你的模型,你不能这么做。@MichaelKay非常感谢,这无疑提高了我的理解力。理想情况下,正确的答案应该是您的评论和kjhughes的答案的组合。好吧,当我说我的解决方案使得在第一个el1或el2元素被解析后就可以明确地选择哪个选项时,我的意思是没有前瞻性。我现在明确地添加了它,但请注意,如果您发现原始形式有歧义,您现在需要提前查看句子中的最后两个单词以解决歧义。:-)我想我的困惑是因为我没有意识到前瞻性甚至是决定歧义的一个因素。谢谢你的回答!
<?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>