,xml,xsd,xsd-validation,xml-validation"/>

首页 > 解决方案 > XML Schema:使用之间的区别而不是当 minOccurs="0"

问题描述

这之间有什么区别(取自 w3schools.com 参考<xs:all>):

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string" minOccurs="0"/>
      <xs:element name="lastname" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
</xs:element>

和这个:

<xs:element name="person">
  <xs:complexType>
      <xs:element name="firstname" type="xs:string" minOccurs="0"/>
      <xs:element name="lastname" type="xs:string" minOccurs="0"/>
  </xs:complexType>
</xs:element>

请注意每个子元素包含minOccurs="0",并注意第二个示例中缺少<xs:all>标记。

据我了解,如果子元素未指定minOccurs="0",则<xs:all>使其整个组根本无法出现。而不使用<xs:all>意味着所有子元素都必须出现一次,因为元素中的minOccursand的默认值为maxOccurs1。

但是,当您确实指定minOccurs="0"所有子元素时,两个示例不是相同的约束吗?不都意味着每个元素都可以出现一次或不出现吗?

我没有看到这个<xs:all>元素有多大用处。也许你可以告诉我它在哪里有用。

标签: xmlxsdxsd-validationxml-validation

解决方案


您的第二个示例不是有效的 XSD,因为xs:element不能作为xs:complexType. 假设您的第二个示例实际上是

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" minOccurs="0"/>
      <xs:element name="lastname" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

然后,我们可以解释何时使用 which 如下:

  • xs:sequence元素排序重要时使用。
  • xs:all当元素排序无关紧要时使用。

在这两种情况下,都minOccurs="0"表示关联元素是可选的。

因此,在您的(固定)情况下,您的xs:all示例将允许firstname并以任何顺序lastname显示为子项;person您的xs:sequence示例将限制firstname之前 lastname作为person.


推荐阅读