XML 架构:使用 <xs:all> 与 minOccurs="0" 时不使用的区别

XML Schema: Difference between using <xs:all> and not when 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> 意味着所有子元素都必须出现一次,因为元素中 minOccursmaxOccurs 的默认值为 1.

但是,当您在所有子元素上指定 minOccurs="0" 时,两个示例不会是相同的约束吗?两者不都意味着每个元素要么出现一次,要么不出现?

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

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

<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:

  • 元素顺序 显着.[=44 时使用 xs:sequence =]
  • 当元素排序无关紧要时使用xs:all.

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

因此,在您的(固定)情况下,您的 xs:all 示例将允许 firstnamelastnameperson 上显示为 children任何订单;您的 xs:sequence 示例将限制 firstname 出现在 之前 lastname 作为 children of person.