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 19:49:51 UTC