Indicador de Tipo Composto do XSD

Através do indicador, podemos controlar a forma como os elementos são usados no documento.

Indicador

Existem sete tipos de indicadores:

Indicador de Ordem:

  • Tudo
  • Escolha
  • Sequência

Indicador de Ocorrência:

  • maxOccurs
  • minOccurs

Indicador de grupo:

  • Nome do grupo
  • attributeGroup name

Indicador de ordem

O indicador de ordem é usado para definir a ordem dos elementos.

Indicador de todos

<all> indicador determina que os elementos filhos podem aparecer em qualquer ordem e que cada elemento filho deve aparecer apenas uma vez:

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

Notas:Quando você usa o indicador <all>, você pode definir <minOccurs> como 0 ou 1, mas só pode definir o indicador <maxOccurs> como 1 (que será explicado mais à frente).

Indicador de escolha

<choice> indicador determina que um subelemento pode aparecer ou que outro subelemento pode aparecer (ouro ou prata):

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

Dica:Para definir que um elemento filho pode aparecer qualquer número de vezes, você pode definir <maxOccurs> (que será explicado mais à frente) como unbounded (indefinido).

Indicador de sequência

<sequence> determina que os elementos filhos devem aparecer em uma ordem específica:

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

Indicador de ocorrência

O indicador de ocorrência é usado para definir a frequência de aparição de um elemento.

Notas:Para todos os indicadores "Order" e "Group" (any, all, choice, sequence, nome do grupo e referência do grupo), os valores padrão de maxOccurs e minOccurs são ambos 1.

Indicador maxOccurs

<maxOccurs> indicador pode determinar a maior quantidade de vezes que um elemento pode aparecer:

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

Os exemplos acima mostram que o elemento "child_name" pode aparecer no elemento "person" pelo menos uma vez (onde o valor padrão de minOccurs é 1) e no máximo 10 vezes.

Indicador minOccurs

<minOccurs> indicador pode determinar a menor quantidade de vezes que um elemento pode aparecer:

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

Os exemplos acima mostram que o elemento "child_name" pode aparecer no elemento "person" pelo menos 0 vezes e no máximo 10 vezes.

Dica:Para permitir que um elemento apareça sem limite de vezes, use a declaração maxOccurs="unbounded":

Um exemplo real:

Arquivo XML chamado "Myfamily.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xsi:noNamespaceSchemaLocation="family.xsd">
<person>
<full_name>Tony Smith</full_name>
<child_name>Cecilie</child_name>
</person>
<person>
<full_name>David Smith</full_name>
<child_name>Jogn</child_name>
<child_name>mike</child_name>
<child_name>kyle</child_name>
<child_name>mary</child_name>
</person>
<person>
<full_name>Michael Smith</full_name>
</person>
</persons>

Este arquivo XML contém um elemento raiz chamado "persons". Dentro deste elemento raiz, definimos três elementos "person". Cada elemento "person" deve conter um elemento "full_name", e pode conter até 5 elementos "child_name".

Este é o arquivo de schema "family.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>

Indicador Group

O indicador Group é usado para definir um conjunto de elementos relacionados.

Grupo de elementos

O grupo de elementos é definido através da declaração group:

<xs:group name="组名称">
  ...
</xs:group>

Você deve definir um elemento all, choice ou sequence dentro da declaração group. O exemplo a seguir define um grupo chamado "persongroup", que define um grupo de elementos que devem aparecer na ordem exata:

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

Depois de você definir o grupo, você pode chamá-lo em outra definição:

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

Grupo de atributos

O grupo de atributos é definido através da declaração attributeGroup:

<xs:attributeGroup name="组名称">
  ...
</xs:attributeGroup>

O exemplo a seguir define um grupo de atributos chamado "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>

Após você definir o grupo de atributos, você pode chamá-lo em outra definição, assim:

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