ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> xml-dev
xml-dev
Re: Identity-constraint
by Eddie Robertsson other posts by this author
Feb 13 2001 11:26PM messages near this date
Re: Identity-constraint | 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
Thread:
Faroukh Fekravar
Eddie Robertsson
Eddie Robertsson
Faroukh Fekravar

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved