[XML Schema] Conditioneel uitsluiten van kind-element;

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 64768

Topicstarter
Conditioneel uitsluiten van kind-element in een xmschema.

Is het mogelijk om in de definitie van een element (in een xmlschema) de afwezigheid van een bepaald kindelement af te dwingen, op basis van waar het ouderelement wordt gebruikt?

bijv.

element A1 bevat een element A11 of A12


element B1 bevat A1, maar mag niet het kindelement A12 bevatten.
en
element B2 bevat A1, maar mag niet het kindelement A11 bevatten.

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Je hebt dus deze situatie:

code:
1
2
3
ElementName: A1-1  |  A1-2 -> A1
ElementName: A1 -> B1
ElementName: A1 -> B2

A1-1, A1-2, A1, B1 en B2 zijn hier non-terminals. Elke productie-regel heeft een ElementName. Deze zie je terug in het XML bestand. De non-terminals zie je in principe niet terug zie je in feite alleen in het XML Schema.

Je zal dan toch de 'beide A1 gevallen' als andere non-terminals (complex-types zo je wilt) moeten gaan zien. Je zou hierbij dan eigenlijk gebruik willen maken van derived types met behulp van restriction, maar helaas is het subclassing mechanisme van W3C XML Schema nogal zwakjes. Als de situatie zo eenvoudig is, is dat sowieso nogal een overkill en zou je gewoon 2 verschillende non-terminals kunnen gebruiken voor de beide situaties.

Je krijgt dan dit:
code:
1
2
3
4
ElementName: A1-1 -> C1
ElementName: A1-2 -> C2
ElementName: C1 -> B1
ElementName: C2 -> B2

Je ziet hier dus twee nieuwe non-terminals C1 en C2 die de non-terminal A1 vervangt en zo onderscheid maakt tussen de twee situaties.

In andere schema talen voor XML kan je soms wel dit soort beperkingen opleggen zoals jij het eigenlijk wilt. Hierbij wordt dan vaak gebruik gemaakt van XPath.

Mod: kan hier misschien XML Schema in de titel komen te staan?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

mbravenboer schreef op 13 september 2002 @ 15:45:
Mod: kan hier misschien XML Schema in de titel komen te staan?


ligt eraan... wat schuift het? :P ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
.oisyn: ligt eraan... wat schuift het? :P ;)
een kusje ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Anoniem: 64768

Topicstarter
mbravenboer, bedankt voor je reactie, maar *die* oplossing wilde k nou net niet toepassen (vandaar zocht ik een alternatief). Het probleem is dat ik met een standaard moet werken (die is gedefinieerd mbv een dtd, maar wil verfijnen naar een xmlschema) , dus lukraak wat elementen aanpassen of toevoegen is niet zo gewenst. (btw, die productieregels zien er wel interessant uit he? ;) )

Groeten,
kasey

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Kasey: Het probleem is dat ik met een standaard moet werken (die is gedefinieerd mbv een dtd, maar wil verfijnen naar een xmlschema) , dus lukraak wat elementen aanpassen of toevoegen is niet zo gewenst.
Je voegt geen elementen toe: de verzameling elementen blijft precies gelijk. Je splitst alleen een non-terminal op in twee andere non-terminals. Deze splitsing zie je echter niet terug in je XML documenten en je blijft dus gewoon compatible met de standaard. Non-terminals (typen) zie je namelijk helemaal niet terug in een XML document: je ziet alleen de toepassing van productie-regels terug.

Moet ik even een XML Schema voorbeeld geven van wat ik bedoel?
btw, die productieregels zien er wel interessant uit he? ;)
Ach, je kan er in een paar regels ongeveer hetzelfde mee zeggen als een paar pagina's W3C XML Schema :+ .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
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.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Hum het forum haalt al m'n new-lines weg :( . Bekijk de source van mijn bericht ff voor de versie met newlines: die is een stuk duidelijker.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1