目录

XSD 指示器


我们可以控制如何在带有指示符的文档中使用元素。


指示器

有七个指示器:

顺序指示器:

  • 全部
  • 选择
  • 顺序

出现指示器:

  • 最大出现次数
  • 最小出现次数

组指示器:

  • 组名称
  • 属性组名称

顺序指示器

顺序指示符用于定义元素的顺序。

所有指示器

<all> 指示符指定子元素可以按任意顺序出现,并且每个子元素只能出现一次:

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

笔记:使用<all>指示符时,可以将<minOccurs>指示符设置为0或1,而<maxOccurs>指示符只能设置为1(<minOccurs>和<maxOccurs>将在后面描述)。

选择指示器

<choice> 指示符指定可以出现一个或另一个子元素:

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

顺序指示器

<sequence> 指示符指定子元素必须按特定顺序出现:

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


出现指示器

出现指示器用于定义元素出现的频率。

笔记:对于所有 "Order" 和 "Group" 指示符(任意、全部、选择、序列、组名称和组引用),maxOccurs 和 minOccurs 的默认值为 1。

最大出现次数指示器

<maxOccurs> 指示符指定元素可以出现的最大次数:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的示例表明 "child_name" 元素在 "person" 元素中至少可以出现一次(minOccurs 的默认值为 1),最多可以出现 10 次。

最小出现次数指示器

<minOccurs> 指示符指定元素可以出现的最小次数:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的示例表明"child_name" 元素在"person" 元素中最少可以出现零次,最多可以出现十次。

提示:要允许元素出现无限次,请使用 maxOccurs="unbounded" 语句:

一个工作示例:

名为 "Myfamily.xml" 的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">

<person>
  <full_name>Hege Refsnes</full_name>
  <child_name>Cecilie</child_name>
</person>

<person>
  <full_name>Tove Refsnes</full_name>
  <child_name>Hege</child_name>
  <child_name>Stale</child_name>
  <child_name>Jim</child_name>
  <child_name>Borge</child_name>
</person>

<person>
  <full_name>Stale Refsnes</full_name>
</person>

</persons>

上面的 XML 文件包含一个名为 "persons" 的根元素。在这个根元素中,我们定义了三个"person" 元素。每个"person" 元素必须包含一个"full_name" 元素,并且最多可包含五个"child_name" 元素。

这是架构文件"family.xsd":

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">

<xs:element name="persons">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="full_name" type="xs:string"/>
            <xs:element name="child_name" type="xs:string"
            minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

组指示器

组指示符用于定义相关的元素集。

元素组

元素组是通过组声明来定义的,如下所示:

<xs:group name="groupname">
...
</xs:group>

您必须在组声明中定义 all、choice 或equence 元素。以下示例定义了一个名为 "persongroup" 的组,该组定义了一组必须按精确顺序出现的元素:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

定义组后,您可以在另一个定义中引用它,如下所示:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

属性组

属性组是使用 attributeGroup 声明定义的,如下所示:

<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>

以下示例定义了名为"personattrgroup" 的属性组:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

定义属性组后,您可以在另一个定义中引用它,如下所示:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>