[XSD] Willekeurige volgorde, één uniek element

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 02-06 21:34
Ik probeer een XML Schema te maken dat de volgende XML definieert:

XML:
1
2
3
4
5
6
<eend>
  <naam>Donald</naam>
  <kind>Kwik</kind>
  <kind>Kwek</kind>
  <kind>Kwak</kind>
</eend>


Met daaraan de volgende eisen:
1. element naam moet precies 1x voorkomen
2. element kind moet minimaal 1x voorkomen
3. element naam hoeft niet het eerste element te zijn (maar mag overal staan)


Eis 3 is wat de problemen oplevert. Zonder die eis is het eenvoudig:

XML:
1
2
3
4
5
6
7
8
<xs:element name="eend">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="naam" />
      <xs:element name="kind" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>


Analoog daaraan, dacht ik de derde eis op te lossen door xs:sequence te vervangen door xs:all:
XML:
1
2
3
4
5
6
7
8
<xs:element name="eend">
  <xs:complexType>
    <xs:all>
      <xs:element name="naam" />
      <xs:element name="kind" maxOccurs="unbounded"/>
    </xs:all>
  </xs:complexType>
</xs:element>

Helaas is dat geen geldig XML Schema omdat unbounded niet wordt toegestaan binnen een xs:all element.

Ik ben ook al andere richtingen op aan het denken geweest, zoals naam in een aparte complexType definiëren, waarna ik kind die laat extenden. Vooralsnog zonder succes.

Er zijn wel alternatieven, zoals een nieuwe tag kinderen introduceren die alle kind tags omsluit. Of door simpelweg eis 3 te laten vallen. Deze opties hebben echter niet mijn voorkeur omdat de XML die ik wil valideren al bestaat.

Kan ik mijn schema zo opstellen dat aan alle drie de genoemde eisen wordt voldaan?


Excuses voor het flauwe Donald Duck-voorbeeldje, ik kon niks beter bedenken om mijn probleem te illustreren. :)

The sentence below is true.
The sentence above is false.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Het echte probleem is de XML, niet de XSD. De kind-elementen horen eigenlijk in een eigen groepje te staan. Dan is jouw huidige probleem, de XSD, ook opgelost, deze bestaat zelfs niet meer. Het feit dat XSD er niet (goed) mee uit de voeten kan, geeft al aan dat de XML fout/ongelukkig is opgesteld.

In XSD kun je kiezen uit de indicators all, choice en sequence, maar geen van alleen voldoen met de huidige XML. Ik zou er dan ook voor kiezen om de XML te fixen en een element kinderen erin zetten. Dat kost nu even wat extra tijd maar lost ook toekomstige problemen en uitdagingen op.

Het Donald Duck-voorbeeld is een uitstekend voorbeeld, het geeft heel goed weer dat de XML niet goed is. De hierarchie Donald <=> neefjes is niet goed, deze staan nu op het zelfde niveau. Oom Donald is echter geen neef van de neefjes (zelfde niveau), hij is een oom. En staat dus op een ander niveau.

Acties:
  • 0 Henk 'm!

Anoniem: 280479

@cariolive23 mooie en heldere uitleg _/-\o_