指定必须至少具有一个子元素的元素的类型

时间:2015-05-14 12:23:12

标签: xml xsd xml-validation

元素elements必须至少包含元素element1element2,但每个元素最多只包含一次。为此我已经指定了以下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(或来自他们的元素)   替代组)违反“独特粒子归因”。中   针对此模式的验证,将为这些模式创建歧义   两个粒子。

为什么呢?

1 个答案:

答案 0 :(得分:1)

您的XSD违反唯一粒子归因的原因是xs:choice之间关于element1是否应该与第一种或第二种选择相关联的模糊性。

您可以使用XSD 1.1的断言来避免违规,并且仍然需要element1element2中的至少一个:

<?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作者的工作有点困难)。