OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Identity-constraint



> Folks,
>
> I'm validating my xml instance (generated manually) based on the schema
> below by using XSV
> and get the 'cvc-identity-constraint.2.3.2' error.
> (No key or unique constraint named Item1Key declared, refed by keyref
> Item2_KeyRef)
> I'm not usre whether I'm missing something here or XSV has some
> limitation/bugs.

>XML Instance:
><Project
>
><Item1 Item1_2="123">
><Item1_1>999</Item1_1>
></Item1>
>
><Item2 Item2_2="123">
> <Item2_1>999</Item2_1>
> </Item2>
>
></Project>

I don't think that XSV has fully implemented the validation regarding keys
and keyref yet but I don't think that is the problem with your schema. From
what I can understand of your instance above you want to define a key for
Item1/@Item1_2 and then reference this key saying that the value of
Item2/@Item2_2 must be the same as an already existing Item1/@Item1_2.
Correct?
If this is correct you must declare the key in the scope of where you want
it to be unique and in this case you want the Item1/@Item1_2 value to be
unique within the scope of the Project element. This means that the key
should be declared within the scope of the Project element and not within
the scope of the Item1 element. The same will apply to your keyref
declaration, it should be declared within the scope of the Project element
instead of the Item2 element. This means your schema should be:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="qualified" targetNamespace="www.allette.com.au/keyref"
xmlns="www.allette.com.au/keyref">
 <xsd:element name="Project">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref="Item1" minOccurs="0"/>
    <xsd:element ref="Item2" minOccurs="0"/>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:key name="Item1Key">
   <xsd:selector xpath="Item1"/>
   <xsd:field xpath="@Item1_2"/>
  </xsd:key>
  <xsd:keyref name="Item2_KeyRef" refer="Item1Key">
   <xsd:selector xpath ="Item2"/>
   <xsd:field xpath ="@Item2_2"/>
  </xsd:keyref>
 </xsd:element>

 <xsd:element name="Item1">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="Item1_1" type="xsd:string" minOccurs="0"
maxOccurs="1"/>
   </xsd:sequence>
   <xsd:attribute name="Item1_2" type="xsd:string" use="required"/>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="Item2">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="Item2_1" type="xsd:string" minOccurs="0"
maxOccurs="1"/>
   </xsd:sequence>
   <xsd:attribute name="Item2_2" type="xsd:string" use="required"/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

But remember that I don't think XSV has fully implemented the validation of
key and keyref. I also noticed that in the above schema you have declared
your Item1 element as being optional (minOccurs=0) but when you define
Item1/@Item1_2 as a key this attribute _must_  appear in an instance.

Cheers,
Eddie