Peter Morris
Peter Morris

Reputation: 23224

xs:unique is matching multiple values when they are unique

As far as I can see the following XML should pass validation against the XSD beneath it because all of the "symbolName" values are unique. However when I try to validate it I get the following error

The field 'symbolName' of identity constraint 'xxxxxxsdfsdfsdfsdf' matches 9 times within the scope of element 'symbols'

<levelSymbolCollection>
    <levelName>Simple</levelName>
    <symbols>
        <symbolName>Letter-A</symbolName>
        <symbolName>Letter-B</symbolName>
        <symbolName>Letter-C</symbolName>
        <symbolName>Letter-D</symbolName>
        <symbolName>Letter-E</symbolName>
        <symbolName>Letter-F</symbolName>
        <symbolName>Letter-I</symbolName>
        <symbolName>Letter-O</symbolName>
        <symbolName>Letter-U</symbolName>
    </symbols>
</levelSymbolCollection>

<xs:element name="levelSymbolCollection" maxOccurs="unbounded">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="levelName" type="requiredString"/>
            <xs:element name="symbols">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="symbolName" type="requiredString" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="xxxxxxxxsdfsdfsdfsdf">
        <xs:selector xpath="symbols"></xs:selector>
        <xs:field xpath="symbolName"></xs:field>
    </xs:unique>
</xs:element>

Upvotes: 0

Views: 108

Answers (2)

Peter Morris
Peter Morris

Reputation: 23224

Add "symbolName" to the selector, set the field xpath="."

<xs:element name="levelSymbolCollection" maxOccurs="unbounded">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="levelName" type="requiredString"/>
            <xs:element name="symbols">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="symbolName" type="requiredString" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="xxxxxxxxsdfsdfsdfsdf">
                  <xs:selector xpath="symbolName"></xs:selector>
                  <xs:field xpath="."></xs:field>
                </xs:unique>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Upvotes: 1

Michael Kay
Michael Kay

Reputation: 163272

You clearly have some misunderstanding of the meaning of xs:unique. Your declaration says that every symbolName must have a unique value, and indeed, every symbolName does have a unique value.

Upvotes: 0

Related Questions