元素elements
必须至少包含元素element1
或element2
,但每个元素最多只包含一次。为此我已经指定了以下XML Schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="elements" type ="elementsType"/>
<xs:complexType name="elementsType">
<xs:choice>
<xs:sequence>
<xs:element name="element1" type="xs:string" minOccurs="0"/>
<xs:element name="element2" type="xs:double"/>
</xs:sequence>
<xs:element name="element1" type="xs:string"/>
</xs:choice>
</xs:complexType>
<xs:schema/>
验证此XML Schema会产生“Unique Particle Attribution”违规错误:
cos-nonambig:element1和element1(或来自他们的元素) 替代组)违反“独特粒子归因”。中 针对此模式的验证,将为这些模式创建歧义 两个粒子。
为什么呢?
答案 0 :(得分:1)
您的XSD违反唯一粒子归因的原因是xs:choice
之间关于element1
是否应该与第一种或第二种选择相关联的模糊性。
您可以使用XSD 1.1的断言来避免违规,并且仍然需要element1
和element2
中的至少一个:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="elements" type ="elementsType"/>
<xs:complexType name="elementsType">
<xs:sequence>
<xs:element name="element1" type="xs:string" minOccurs="0"/>
<xs:element name="element2" type="xs:double" minOccurs="0"/>
</xs:sequence>
<xs:assert test="count(*) > 0"/>
</xs:complexType>
</xs:schema>
我不明白为什么会有歧义。如果实例包含 element1和element2或only element2只是第一个选择 可能。否则,如果只有一个element2,则第二个选择 仅适用。
假装您是验证解析器并遇到element1
。你不知道是否要将它与xs:choice
的第一个或第二个分支联系起来,从而产生歧义。当然,你可以向前看一个级别并解决模糊性,但是你应该向前看多远? XSD建议说,作为一个有效的解析器,在这些情况下不应该完全展望。因此,您作为验证器解析器的工作更容易(但您作为XSD作者的工作有点困难)。