- From: Eddie Robertsson <erobertsson@allette.com.au>
- Date: Wed, 31 Jul 2002 09:44:21 +1000
- To: Cyrill Zadra <czadra@bluewin.ch>
- CC: xmlschema-dev@w3.org
Hi Cyrill, > I road many article to the theme unique, key an keyref but i'm still > not understanding how it works. > > In my projekt there is an element user with the attribute *id*. The > user element can be found many times but the id must always be a > different value. > > <user id="1"> > <name></name> > <email></email> > </user> > <user id="2"> > <name></name> > <email></email> > </user> > > I thougt it would be possible with "key", wouldn't it? If not, how > would you realize this problem? Yes, this is certainly one of the usecases for the xs:key mechanism in W3C XML Schema. In your example I guess you're schema look something like this: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="SomeRoot"> <xs:complexType> <xs:sequence> <xs:element name="user" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Now if you want to make sure that all the user/@id are unique within the whole document you add the following xs:key declaration to the element declaration for the SomeRoot element: <xs:key name="uniqueId"> <xs:selector xpath=".//user"/> <!-- All descendant "user" elements to the "SomeRoot" element must be unique... --> <xs:field xpath="@id"/> <!-- ...in terms of the "id" attribute --> </xs:key> So, your schema should now look like this: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="SomeRoot"> <xs:complexType> <xs:sequence> <xs:element name="user" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="uniqueId"> <xs:selector xpath=".//user"/> <xs:field xpath="@id"/> </xs:key> </xs:element> </xs:schema> Cheers, /Eddie
Received on Tuesday, 30 July 2002 19:30:50 UTC