Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XML]sequence afdwingen obv attribuut

Pagina: 1
Acties:

  • Kuppelhut
  • Registratie: December 2006
  • Laatst online: 24-07 09:02

Kuppelhut

Honi Soit Qui Mal Y Pense

Topicstarter
Verzoek van een klant: weet iemand of (en hoe) ik op basis van een attribuut de kindelementen kan afdwingen?

Er is een uitgebreide bak legacy-content die niet geconverteerd mag worden, maar wel valide moet blijven, dus zit ik vast aan de bestaande element- en attribuutnamen. Daarnaast is bijv. Schematron geen optie (ivm huidige tooling) en zit ik vast aan een enkele XSD. (het moet niet te makkelijk worden he? :P )

Dus wil ik de sequence/choice als volgt afdwingen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<test>
    <element type="A">
        <subelement1/>
        <subelement2/>
    </element>
    <element type="B">
        <subelement3/>
        <subelement4/>
    </element>
    <element type="C">
        <subelement1/>
        <subelement4/>
    </element>
</test>


Goeie ideeën zijn welkom!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Zoals ik het nu lees wil je meerdere (legacy) schema's opnemen in een enkele XSD. Kun je niet op basis van de elementen achterhalen (mbv enkele xpath queries) met welke legacy content je te maken hebt en deze 'intern' omzetten naar je nieuwe formaat?

Theoretisch zijn meerdere schema's wel in 1 XSD te plaatsen, maar dan is niet verstandig. Als je ergens een klein foutje maakt, dan heeft dat meestal gevolgen voor alle schema's in dat bestand met als gevolg dat geen enkele XML meer als valide wordt gezien.

Als het echt de volgorde van de elementen en attributen gaan en niet zozeer de inhoud, dan kun je misschien beter je toevlucht zoeken tot een DTD. Daarnaast vind ik persoon een DTD iets eenvoudiger te lezen en te schrijven. Verder heeft XSD geen gecombineerd sequence/choice optie waarbij je ongeacht de volgorde kunt aangeven welke elementen onder een node aanwezig moeten zijn. Bij vrijwel elke XML applicatie maakt de volgorde van de elementen niet uit. In neem dat in jouw voorbeeld subelement1 en subelement2 ook omgedraaid zouden mogen worden. XSD heeft daar geen support voor. In een DTD zou je de volgende definitie kunnen gebruiken:
XML:
1
2
3
4
<!ELEMENT element (subelement1,subelement2|subelement3,subelement4|subelement1,subelement4)>
    <!ATTLIST element
        type CDATA #REQUIRED
    >


Een nadeel. In een DTD kun je niet aangeven welke elementen verplicht zijn bij een bepaalde attribute value. Maar ik weet ook niet zeker of dat wel kan bij een XSD.

If it isn't broken, fix it until it is..


  • Kuppelhut
  • Registratie: December 2006
  • Laatst online: 24-07 09:02

Kuppelhut

Honi Soit Qui Mal Y Pense

Topicstarter
Helaas. DTD's zijn geen optie ivm restrictie op datatyping, lengte, Occurs etc.
Bovendien wil de klant dat de nieuwe restrictie op subelementen gebeurt op basis het attribuut van het ouderelement, maar zijn oude xml moet nog wel valideren tegen de nieuwe XSD...

En helaas weet ik ook niet of dat wel kan met een XSD. :? ;(

[ Voor 10% gewijzigd door Kuppelhut op 11-10-2007 14:30 ]