Ik ben me nu al een langere tijd aan het verdiepen in de wondere wereld van XML en ik moet zeggen dat het me steeds beter begint te bevallen. Vooral de mogelijkheden van XML Schema zijn fantastisch. Echter valt de hoeveelheid informatie en voorbeelden op het net me tegen. Ik heb daarom ook een boek gekocht 'XML Schema' door Eric van der Vlist.
Nu wil ik unique constraints en keys toepassen op diverse attributen.
Ik stel mijn hoofddocument samen uit diverse subschema definities. Dit werkt prima.
DatabaseTypes.xsd
Database.xsd
Ik wil nu twee dingen doen. Ik wil door het hele document het attribuut 'id' uniek verklaren. Dit zou ik willen doen dmv een unique element:
Echter valideert mijn document nog steeds, ook al staan er meerdere group-elementen met hetzelfde id.
Tevens wil ik de group-name als key kunnen gebruiken. Dit probeer ik met:
Ook dit valideert als ik meerdere group-elementen heb met dezelfde naam. Het is natuurlijk nog mooier deze definitie te verplaatsen binnen de 'groups' definitie, echter lost dit ook niets op.
Ik denk zelf dat dit aan het gebruik van namespaces ligt, maar ik kan de oplossing niet vinden.
Zou ik bijvoorbeeld een selector als deze moeten gebruiken:
Het group-element komt namelijk uit de db-namespace en het name-element daarbinnen uit de dbt-namespace.
Nu wil ik unique constraints en keys toepassen op diverse attributen.
Ik stel mijn hoofddocument samen uit diverse subschema definities. Dit werkt prima.
DatabaseTypes.xsd
XML:
1
2
3
4
5
6
7
8
9
| <xs:complexType name="groupType"> <xs:sequence> <xs:element name="name" type="xs:NMTOKEN" /> <xs:element name="description" type="xs:string" minOccurs="0" /> </xs:sequence> <xs:attribute name="id" type="xs:NCName"/> </xs:complexType> |
Database.xsd
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| <?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://www.example.org/Database.xsd" xmlns:dbt="http://www.example.org/DatabaseTypes" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:import namespace="http://www.example.org/DatabaseTypes" schemaLocation="DatabaseTypes.xsd"/> <xs:element name="database"> <xs:complexType> <xs:sequence> <xs:element name="groups"> <xs:complexType> <xs:sequence> <xs:element name="group" type="dbt:groupType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
Ik wil nu twee dingen doen. Ik wil door het hele document het attribuut 'id' uniek verklaren. Dit zou ik willen doen dmv een unique element:
XML:
1
2
3
4
| <xs:unique name="ID"> <xs:selector xpath=".//group|.//user|.//table"/> <xs:field xpath="@id"/> </xs:unique> |
Echter valideert mijn document nog steeds, ook al staan er meerdere group-elementen met hetzelfde id.
Tevens wil ik de group-name als key kunnen gebruiken. Dit probeer ik met:
XML:
1
2
3
4
| <xs:key name="GroupName"> <xs:selector xpath=".//group"/> <xs:field xpath="name"/> </xs:key> |
Ook dit valideert als ik meerdere group-elementen heb met dezelfde naam. Het is natuurlijk nog mooier deze definitie te verplaatsen binnen de 'groups' definitie, echter lost dit ook niets op.
Ik denk zelf dat dit aan het gebruik van namespaces ligt, maar ik kan de oplossing niet vinden.
Zou ik bijvoorbeeld een selector als deze moeten gebruiken:
XML:
1
2
3
4
| <xs:key name="GroupName"> <xs:selector xpath=".//dbt:group"/> <xs:field xpath="name"/> </xs:key> |
Het group-element komt namelijk uit de db-namespace en het name-element daarbinnen uit de dbt-namespace.
"Chaos kan niet uit de hand lopen"