[XML] meerdere types voor een element?

Pagina: 1
Acties:

  • zsparrow
  • Registratie: November 2006
  • Laatst online: 10-10-2024
Beste,

Ik heb een XML vraag:

Ik ben bezig met een schema. Hierin beschijf ik een element van het type 'xsd:dateTime'. Maar het is de bedoeling dat het is toegestaan dat deze gewoon leeg wordt gelaten, dus:

<moment></moment>

Hoe kan ik dit in het schema aangeven? Ik dacht aan meerdere type's voor 1 element toestaan...

Nu had ik ergens op internet het volgende advies gevonden:

"
You could design a common base type ABC, have each of AAA, BBB, CCC extend it, and make myElement of type ABC. ABC could perhaps be an abstract type, so instance documents will be forced to use xsi:type to specify one of AAA, BBB, or CCC.
"

... klinkt als een oplossing voor mijn probleem. Helaas stond er geen voorbeeld bij en kan ik ook nergens een voorbeeld vinden, van hoe ik dat aan zou moeten pakken.

Kan iemand mij helpen?


bij voorbaat dank!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even uit mijn hoofd, je kunt een element toch gewoon nullable maken met iets als nillable="true" ofzo :?

Effe gegoogled: http://www.w3schools.com/schema/el_element.asp

[ Voor 24% gewijzigd door RobIII op 20-11-2006 02:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Het is inderdaad mogelijk om het attribute 'nillable' aan de xsd toe te voegen.

Verder moet je je ook afvragen waarom je het element leeg wilt laten. Als dit het geval is omdat er in sommige gevallen geen datum/tijd beschikbaar is dan is het waarschijnlijk logischer om dit element optioneel te maken. De oplossing die je zelf hebt gevonden lijkt mij een beetje smerig.

  • zsparrow
  • Registratie: November 2006
  • Laatst online: 10-10-2024
Bedankt voor de reacties, ik denk dat ik wat extra info over mijn vraag moet geven:

voor dat element 'moment' is inderdaad ook nillible="true" opgegeven. Maar wanneer in de XML dan
<moment></moment>
staat, is dit (volgens XMLspy) niet vallide. wel valide zou zijn:
<moment xsi:nil="true"/> of
<moment xsi:nil="true"></moment>

Ik wil dus dat valide is:
- <moment> echt een datum/tijd volgens XSD:dateTime </moment>
- <moment></moment>
- <moment xsi:nil="true"/> of <moment xsi:nil="true"></moment>

en niets anders dan die drie, maar ook de middelste moet dus valide zijn....

Ik hoop dat ik mijn vraag nu wat duidelijker heb omschreven.

Verwijderd

Wat je hier dus wil is twee verschillende types toekennen aan dezelfde tag binnen dezelfde scope. Je wilt dus dat je tag één van de volgende types is:
  • een xs:dateTime (mag nilleble zijn);
  • een xs:string met een maxLength van 0.
Het is, voor zover ik weet, niet toegestaan om aan een dergelijke tag (binnen dezelfde scope) twee verschilende types toe te kennen.

Dit is op te lossen op de volgende manieren:
  • alleen strings toe te staan en zelf met je software te valideren of de waarde geldig is;
  • een (regex) pattern te schrijven waaraan je string tag moet voldoen (maar ik weet niet of dit wel gaat).
Verder wil ik er nogmaals op wijzen dat hetgeen je hier wilt doen niet erg netjes is (vandaar dat het ook niet met een XSD te beschriijven is) en je een erg goede reden moet hebben waarom je dit wilt ondersteunen. Een lege xs:dateTime die je hier wilt introduceren komt namelijk overeen met een optioneel element, dus waarom dat niet gebruiken :?

  • zsparrow
  • Registratie: November 2006
  • Laatst online: 10-10-2024
Verwijderd schreef op maandag 20 november 2006 @ 11:27:
Verder wil ik er nogmaals op wijzen dat hetgeen je hier wilt doen niet erg netjes is (vandaar dat het ook niet met een XSD te beschriijven is) en je een erg goede reden moet hebben waarom je dit wilt ondersteunen. Een lege xs:dateTime die je hier wilt introduceren komt namelijk overeen met een optioneel element, dus waarom dat niet gebruiken :?
Als ik het element optioneel maak kan 'moment' dus helemaal weggelaten worden, dat wil ik niet. Het is gewoon niet handig voor hoe en waar en voor wie ik de XSD's in wil zetten. Met andere woorden:
<moment></moment> of <moment/> moet in ieder geval aanwezig zijn en ook toegelaten worden.

Enig idee hoe het zit met die optie die ik in mijn eerste mail omschreef?
("
You could design a common base type ABC, have each of AAA, BBB, CCC extend it, and make myElement of type ABC. ABC could perhaps be an abstract type, so instance documents will be forced to use xsi:type to specify one of AAA, BBB, or CCC.
")

mvg,

Verwijderd

zsparrow schreef op maandag 20 november 2006 @ 11:43:
Als ik het element optioneel maak kan 'moment' dus helemaal weggelaten worden, dat wil ik niet. Het is gewoon niet handig voor hoe en waar en voor wie ik de XSD's in wil zetten. Met andere woorden:
<moment></moment> of <moment/> moet in ieder geval aanwezig zijn en ook toegelaten worden.
Ik zie niet in waarom je de tag niet optioneel kunt maken en waarom het niet handig is. De oplossing die je nu zoekt is mijn inziens veel onhandiger. Het is inderdaad mogelijk om een optioneel element weg te laten (:)) maar dat is hetzelfde als de situaties die jij hier beschrijft (<moment></moment> en <moment/>) waarneer je een dateTime wilt opslaan. Mocht je nog goede argumenten hebben om het te doen zoals je het nu van plan bent dan hoor ik ze graag, maar ik ben nog niet overtuigd.
Enig idee hoe het zit met die optie die ik in mijn eerste mail omschreef?
("
You could design a common base type ABC, have each of AAA, BBB, CCC extend it, and make myElement of type ABC. ABC could perhaps be an abstract type, so instance documents will be forced to use xsi:type to specify one of AAA, BBB, or CCC.
")
Komt me niet bekend voor en ik vind het niet echt duidelijk. Heb je zelf al iets gedaan? En zo ja, wat? Stonden er voorbeelden bij?

Verwijderd

zsparrow schreef op zondag 19 november 2006 @ 23:52:
"
You could design a common base type ABC, have each of AAA, BBB, CCC extend it, and make myElement of type ABC. ABC could perhaps be an abstract type, so instance documents will be forced to use xsi:type to specify one of AAA, BBB, or CCC.
"

... klinkt als een oplossing voor mijn probleem. Helaas stond er geen voorbeeld bij en kan ik ook nergens een voorbeeld vinden, van hoe ik dat aan zou moeten pakken.
Ik heb zojuist nog een poging gedaan om een valide XSD te maken maar ik krijg het niet voor elkaar om het bovenstaande te maken. Voor zover ik na kan gaan is hetgeen je wilt gewoon niet mogelijk... maar ik ben ook geen expert op dit gebied, dus misschien is er nog hoop :).

  • zsparrow
  • Registratie: November 2006
  • Laatst online: 10-10-2024
In ieder geval bedankt voor de moeite en het proberen!

ik heb zelf helaas nog geen antwoord gevonden... als ik zelf nog een oplossing vind, zal ik dat hier ook posten.
Pagina: 1