W3C home > Mailing lists > Public > xmlschema-dev@w3.org > November 2008

RE: Identity constraints problem

From: Michael Kay <mike@saxonica.com>
Date: Wed, 12 Nov 2008 20:01:58 -0000
To: "'Joe Halpin'" <jhalpin100@gmail.com>, <xmlschema-dev@w3.org>
Message-ID: <B975691E73E0414D813B4F72989CEBCA@Sealion>

If the constraint applies within a branch, define the <xs:unique> constraint
at the level of the branch:

>     <xs:complexType name="Branch">
>         <xs:sequence>
>             <xs:element name="unique-element" type="UniqueElement" />
>         </xs:sequence>
>         <xs:attribute name="id" type="xs:nonNegativeInteger" />
>         <xs:unique name="ElementKey">
>             <xs:selector xpath="unique-element" />
>             <xs:field xpath="@id" />
>         </xs:unique>
>     </xs:complexType> 

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: xmlschema-dev-request@w3.org 
> [mailto:xmlschema-dev-request@w3.org] On Behalf Of Joe Halpin
> Sent: 12 November 2008 19:49
> To: xmlschema-dev@w3.org
> Subject: Identity constraints problem
> 
> 
> I'm trying to figure out how to use identity constraints that 
> are limited to a single branch of an xml document. For 
> example, given the following xml:
> 
> <?xml version="1.0"?>
> <base
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>     xsi:noNamespaceSchemaLocation="test.xsd">
> 
>     <branch id="1">
>         <unique-element id="1">
>             <unique-child id="2" />
>         </unique-element>
>         <unique-element id="3">
>             <unique-child id="4" />
>         </unique-element>
>         <unique-element id="5">
>             <unique-child id="6" />
>         </unique-element>
>     </branch>
>     <branch id="2">
>         <unique-element id="1">
>             <unique-child id="2" />
>         </unique-element>
>         <unique-element id="3">
>             <unique-child id="4" />
>         </unique-element>
>     </branch>
> </base>
> 
> I'd like to ensure that unique-element and unique-child id 
> are unique within the branch in which they appear, but only 
> within that context.
> As it is, I keep getting identity constraint errors because 
> the ids are duplicated between branches. What I'm doing is 
> pretty much like
> this:
> 
> <?xml version="1.0"?>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
> 
>     <xs:element name="base" type="Base">
>         <xs:unique name="BranchKey">
>             <xs:selector xpath="branch"  />
>             <xs:field xpath="@id" />
>         </xs:unique>
> 
>         <xs:unique name="ElementKey">
>             <xs:selector xpath="branch/unique-element" />
>             <xs:field xpath="@id" />
>         </xs:unique>
> 
>         <xs:unique name="ChildKey">
>             <xs:selector xpath="branch/unique-element/unique-child" />
>             <xs:field xpath="@id" />
>         </xs:unique>
>     </xs:element>
> 
>     <xs:complexType name="Base">
>         <xs:sequence>
>             <xs:element name="branch" type="Branch" 
> maxOccurs="unbounded" />
>         </xs:sequence>
>     </xs:complexType>
> 
>     <xs:complexType name="Branch">
>         <xs:sequence>
>             <xs:element name="unique-element" type="UniqueElement" />
>         </xs:sequence>
>         <xs:attribute name="id" type="xs:nonNegativeInteger" />
>     </xs:complexType>
> 
>     <xs:complexType name="UniqueElement">
>         <xs:sequence>
>             <xs:element name="unique-child" maxOccurs="unbounded">
>                 <xs:complexType>
>                     <xs:attribute name="id" 
> type="xs:nonNegativeInteger" />
>                 </xs:complexType>
>             </xs:element>
>         </xs:sequence>
>         <xs:attribute name="id" type="xs:nonNegativeInteger" />
>     </xs:complexType>
> </xs:schema>
> 
> I'm probably just missing it. I've been looking at this so 
> long I suspect I can't see it any more. Is there a way to do 
> what I want?
> 
> Thanks
> 
> joe
> 
Received on Wednesday, 12 November 2008 20:02:38 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 11 January 2011 00:15:09 GMT