Wskaźniki XSD
Możemy kontrolować JAK elementy mają być wykorzystane w dokumentach ze wskaźnikami.
Wskaźniki
Istnieje siedem wskaźników:
Wskaźniki zamówień:
- Wszystkie
- Wybór
- Sekwencja
Wskaźniki występowania:
- maxWystępuje
- minWystępuje
Wskaźniki grupowe:
- Nazwa grupy
- nazwa grupy atrybutów
Wskaźniki zamówień
Wskaźniki kolejności służą do określenia kolejności elementów.
Wszystkie wskaźniki
Wskaźnik <all> określa, że elementy podrzędne mogą pojawiać się w dowolnej kolejności i że każdy element podrzędny musi wystąpić tylko raz:
<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>
Uwaga: Podczas korzystania ze wskaźnika <all> można ustawić wskaźnik <minOccurs> na 0 lub 1, a wskaźnik <maxOccurs> można ustawić tylko na 1 (wskaźniki <minOccurs> i <maxOccurs> są opisane w dalszej części).
Wskaźnik wyboru
Wskaźnik <choice> określa, że może wystąpić jeden lub inny element podrzędny:
<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>
Wskaźnik sekwencji
Wskaźnik <sequence> określa, że elementy podrzędne muszą pojawiać się w określonej kolejności:
<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>
Wskaźniki występowania
Wskaźniki występowania służą do określenia, jak często dany element może wystąpić.
Uwaga: Dla wszystkich wskaźników „Kolejność” i „Grupa” (dowolne, wszystkie, wybór, sekwencja, nazwa grupy i odwołanie do grupy) domyślną wartością dla maxOccurs i minOccurs jest 1.
Wskaźnik maksymalnej liczby wystąpień
Wskaźnik <maxOccurs> określa maksymalną liczbę wystąpień elementu:
<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>
Powyższy przykład wskazuje, że element „child_name” może wystąpić co najmniej jeden raz (wartość domyślna dla minOccurs to 1) i maksymalnie dziesięć razy w elemencie „person”.
Wskaźnik minOccurs
Wskaźnik <minOccurs> określa minimalną liczbę wystąpień elementu:
<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>
Powyższy przykład wskazuje, że element „child_name” może wystąpić minimum zero razy, a maksymalnie dziesięć razy w elemencie „person”.
Wskazówka: aby zezwolić na pojawienie się elementu nieograniczoną liczbę razy, użyj instrukcji maxOccurs="unbounded":
Przykład pracy:
Plik XML o nazwie „Myfamily.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>
Powyższy plik XML zawiera element główny o nazwie „persons”. Wewnątrz tego elementu głównego zdefiniowaliśmy trzy elementy „osobowe”. Każdy element „person” musi zawierać element „full_name” i może zawierać do pięciu elementów „child_name”.
Oto plik schematu „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>
Wskaźniki grupowe
Wskaźniki grupowe służą do definiowania powiązanych zestawów elementów.
Grupy elementów
Grupy elementów definiuje się za pomocą deklaracji grupy, tak jak poniżej:
<xs:group name="groupname">
...
</xs:group>
W deklaracji grupy należy zdefiniować element all, choice lub sequence. Poniższy przykład definiuje grupę o nazwie „persongroup”, która definiuje grupę elementów, które muszą wystąpić w dokładnej kolejności:
<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>
Po zdefiniowaniu grupy możesz odnieść się do niej w innej definicji, na przykład:
<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>
Grupy atrybutów
Grupy atrybutów definiuje się za pomocą deklaracji attributeGroup, tak jak poniżej:
<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>
Poniższy przykład definiuje grupę atrybutów o nazwie „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>
Po zdefiniowaniu grupy atrybutów można odnieść się do niej w innej definicji, na przykład:
<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>