Nou ja, heb sowieso maar even een voorbeeld gemaakt.
Allereerst maar in RELAX NG, want daarin is alles veel duidelijker

.
Dit is je huidige situatie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
default namespace = "http://www.example.org"
start = B
B =
element b1 {A}
| element b2 {A}
A =
element a {Option}
Option =
element option-1 {xsd:string}
| element option-2 {xsd:string} |
B, A en Option zijn hier non-terminals. b1, b2, a, option-1 en option2 zijn namen van elementen. Dit is een voorbeeld van een docje:
code:
1
2
3
4
5
| <b1 xmlns="http://www.example.org">
<a>
<option-1> bla </option-1>
</a>
</b1> |
In de nieuwe situatie heb je in feite twee verschillende A's. Daarom moet je de non-terminal A opsplitsen in twee nieuwe non-terminals:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
default namespace = "http://www.example.org"
start = B
B =
element b1 {A1}
| element b2 {A2}
A1 =
element a {Option1}
A2 =
element a {Option2}
Option1 =
element option-1 {xsd:string}
Option2 =
element option-2 {xsd:string} |
Je ziet dat ik echter nog gewoon gebruik maak van de element namen a, option-1 en option-2. Een b1 elemente kan nu onder de a alleen maar een option-1 bevatten. Een b2 alleen maar een option-2.
In XML Schema is de situatie nu zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xsd:element name="b1" type="type-b"/>
<xsd:element name="b2" type="type-b"/>
<xsd:element name="a" type="type-a"/>
<xsd:element name="option-1" type="xsd:string"/>
<xsd:element name="option-2" type="xsd:string"/>
<xsd:complexType name="type-b">
<xsd:sequence>
<xsd:element ref="a" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type-a">
<xsd:choice>
<xsd:element ref="option-1" minOccurs="1" maxOccurs="1"/>
<xsd:element ref="option-2" minOccurs="1" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
</xsd:schema> |
en de nieuwe situatie kan zo zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xsd:element name="b1" type="type-b1"/>
<xsd:element name="b2" type="type-b2"/>
<xsd:element name="option-1" type="xsd:string"/>
<xsd:element name="option-2" type="xsd:string"/>
<xsd:complexType name="type-b1">
<xsd:sequence>
<xsd:element name="a" type="type-a-1" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type-b2">
<xsd:sequence>
<xsd:element name="a" type="type-a-2" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type-a-1">
<xsd:sequence>
<xsd:element ref="option-1" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type-a-2">
<xsd:sequence>
<xsd:element ref="option-2" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema> |
In XML Schema kan je het op veel verschillende manieren structureren, dus de oplossingen kunnen ook heel anders zijn. Het blijft echter neerkomen op een non-terminal splitsing van A -> naar A1 en A2.