- 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>
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 UTC