Tot mijn spijt, is binnen normaal gebruik van XML de naam van een element (zijn tag) direct gekoppeld aan zijn type. Immers in een DTD wordt voor ieder element naam gedefinieerd welke sub elementen er in voor kunnen komen. Men kan niet een bepaald element type definieren (b.v. TELEFOONNUMMER) en dit onder verschillende namen gebruiken. Gevolg hiervan is dat de namen van elementen zowel de syntax (het type) als de semantiek (het gebruik) moeten representeren. Om bij het telefoonnummer voorbeeld te blijven: men wil van een bepaald data element aangeven dat het de telefoonnummer syntax heeft (d.w.z. het bestaat uit een netnummer element en een abonneenummer element), en tegelijkertijd dat het semantisch om een faxnummer gaat. Dit heeft leidt tot volgende complicaties:
<PERSOON>
<FAXNUMMER>
<TELEFOONNUMMER>
<NETNUMMER>050</NETNUMMER>
<ABONUMMER>1234568</ABONUMMER>
</TELEFOONNUMMER>
</FAXNUMMER>
<WERKNUMMER>
<TELEFOONNUMMER>
<NETNUMMER>070</NETNUMMER>
<ABONUMMER>1234568</ABONUMMER>
</TELEFOONNUMMER>
</WERKNUMMER>
</PERSOON>
Oftewel, als men aan de velden wil refereren, dan heeft men de volgende geneste velden:
PERSOON.FAXNUMMER.TELEFOONNUMMER.NETNUMMER PERSOON.WERKNUMMER.TELEFOONNUMMER.ABONUMMER etcBij deze techniek worden dergelijke tags onnodig lang en diep genest en daardoor slecht leesbaar. Hoewel dit in theorie geen probleem hoeft te zijn, kan dit tot fouten leiden.
Veel belangrijker probleem echter is dat men met deze methode voor ieder nieuw semantisch gebruik, nieuwe element types moet definieren.
Immers, voor bovenstaand voorbeeld is een FAXNUMMER en een WERKNUMMER element type gedefinieerd, die ieder slechts één subelement bevatten, te weten TELEFOONNUMMER.
Deze nieuwe types zijn eigenlijk een beetje nep-types, die weer extra werk kosten om te onderhouden en de namespace van element-types kunnen vervuilen.
Als voordeel van dergelijke nep-types wordt wel eens genoemd dat men hierdoor aan b.v. een faxnummer, later extra elementen kan toevoegen.
Dit is echter een non-argument, want dan zou men net zo goed ook voor alle andere elementen nieuwe types kunnen/moeten aanmaken, en in feite nooit types hergebruiken.
Tot slot valt nog op te merken dat er ook andere manier zijn om hiermee om te gaan. Volgens mij hebben deze alternatieven echter ieder weer hun eigen problemen en zijn ze minder in lijn met de gedachte achter XML. Een altrenatief is bijvoorbeeld om een veldnaam als element-attribuut opnemen (of zelfs een typenaam). In dit voorbeeld heeft een persoon meerdere telefoonnummers, ieder met een verschillende qualifier. Bij deze oplossing is echter weer moeilijk af te dwingen dat b.v. werknummer verplicht is en faxnummer optioneel.
ITEM, GEBRUIKER, etc.
Binnen de specificatie (DTD) van één specifiek bericht zal dit niet snel tot problemen leiden.
Als men echter tot een bedrijfsbreed gegevens model wil komen (of op zijn minst daar naar streven) kan dit tot aanzienlijke afstemmings problemen leiden.
Zeker wanneer, als gevolg van de vorige complicaties, de element types/namen worden vervuild met allerlei nep-types.
Door gebruik te maken van goede naming-conventions kan dit probleem omzeild worden, maar hierdoor worden de namen weer onnodig lang en onleesbaar, omdat ze informatie bevatten die ook uit de context afgeleid had kunnen worden.
Bij naming conventies zou men iets gebruiken zoals
ORDER.ORDER_WERKNUMMER en PERSOON.PERSOON_WERKNUMMERin plaats van
ORDER.WERKNUMMER en PERSOON.WERKNUMMER
Hieronder volgt een opsomming van type condities waar aantoonbaar behoefte aan is gebleken:
assert postcode picture "9999 AA"
assert postcode regexp [1-9][0-9][0-9][0-9] [A-Z][A-Z]
assert abonneenummer length 6..7
assert achternaam length 5..n
assert dienst in PSTN, ISDN, ADSL
assert netnummer in 010, 020, 050, 0592, .....
assert internationaleVasteVerbinding.a_locatie.land mandatory
assert if dienst==ADSL then provider mandatory
assert if cost >= 50000 then medewerker.functie in DIRECTEUR, MANAGER
assert exists( order.gebruiker in table users)
assert exists( nota_id, nota_datum in table facturen)
N.B.: deze checks kunnen niet door de client uitgevoerd worden, maar zijn wel essentieel om te weten bij het ontwikkelen van een client.
assert tijdInvoer <= now()
assert datumAfhandeling <= tijdInvoer.datum + contract.maximale_reparatie_duur
Een nog veel belangrijkere reden om mogelijkheden te bieden om dergelijke condities te specificeren is om ze zichtbaar te maken. Als men dergelijke condities niet in de specificaties kwijt kan, of niet daaruit kan laten controleren, is men gedwongen ergens binnen de implementatie de checks alsnog uit te voeren. Hierdoor worden de diverse checks verborgen in de code, en zijn niet zichtbaar voor partijen die gebruik willen maken van een specifiek bericht. Het is mijn stelling dat al deze eisen in de specificatie thuis horen, en niet in de code (als men dit ook in de code moet checken, loopt men het risico dat de code en de specificatie uit de pas gana lopen). Wat ik tot nu toe van XML gezien heb kan men daar in een DTD slechts een aantal van deze condities in kwijt (met name syntactische).
Ook postcondities kunnen eventueel gebruikt worden. Men zou bijvoorbeeld in de specificaie van iedere request bericht ook kunnen beschrijven welke mogelijke reply berichten daar op te verwachten zijn. Hierbij kan één request resulteren in verschillende types reply berichten (meestal één type bij een succesvolle verwerking, en verschillende "exception" berichten als er iets fout gegaan is). Het is ook denkbaar dat op één request bericht meerder reply berichten terugkomen (al of niet van verschillende types). Hierbij valt te denken aan meerdere status terugkoppelingen voor iedere fase die een order doorloopt, of het in hapklare brokken hakken van een grote resultset.