Re: Understanding keyref constraints in XML Schema

Hi,

Sharon Krisher wrote:
> Hello all.
> I've been reading XML Schema Part 1 - Structures, and trying to 
> understand the semantics of keys and keyrefs, and the rules by which 
> documents are validated with respect to these constraints.. 
> Specifically: given definitions of a key and a keyref, and a node in a 
> document, I want to know which nodes are considered to be referencing it 
> (according to the keyref). In the attached pdf file I've summarized the 
> conclusions I've reached regarding keyref references in XML Schema. 
> Since the standard 
> (http://www.w3.org/TR/xmlschema-1/#cvc-identity-constraint) is not very 
> clear, I don't know whether my observations are correct. I'd appreciate 
> any comments regarding the attached document.

I hope that your observations are correct, since this is how I read the
spec here as well.

I've tried to create a schema + instance as shown below, reflecting the
example tree in your document. The results from the three validators I
used as reference are:

Xerces J- 2.6.2:
   valid

XSV 2.7-1 of 2004/04/01:
   valid

MSXML 4.0:
   _not_ valid (with a strange message):
   "The keyref '{http://FOO}theKey' does not resolve to a key for the
   Identity Constraint '{http://FOO}theKeyref'"


Removing the element "/r/a/d/c/d.val" I get:

Xerces J- 2.6.2:
   valid

XSV 2.7-1 of 2004/04/01:
   _not_ valid:
   "no key in {http://FOO}:theKey for (u'3', u'4')"

MSXML 4.0:
   _not_ valid (with the same message as above)

So XSV seems to follow your observations, but the other two validators
(at least on my side) not. So I hope someone can explain those
differences.

Regards,

Kasimier


file: idc1_0.xsd
(note that I tried to go without the numbers on the element names for
'c' and 'd')
----------------
<?xml version="1.0"?>
<xsd:schema
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://FOO"
   xmlns="http://FOO"
   xmlns:f="http://FOO">

   <xsd:element name="r">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="a"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <!-- 'a' is the scoping element of 'theKeyref' -->
   <xsd:element name="a">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="d"/>
         <!-- 'e' is the target node of 'theKeyref' -->
         <xsd:element ref="e"/>
       </xsd:sequence>
     </xsd:complexType>

     <xsd:keyref name="theKeyref" refer="theKey">
       <xsd:selector xpath="f:e"/>
       <xsd:field xpath="f:val.1"/>
       <xsd:field xpath="f:val.2"/>
     </xsd:keyref>
   </xsd:element>

   <xsd:element name="d">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="c" minOccurs="0"/>
         <xsd:element ref="b" minOccurs="0"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <xsd:element name="b">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="c" maxOccurs="2"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <!-- 'c' is the scoping element of 'theKey' -->
   <xsd:element name="c">
     <xsd:complexType>
       <xsd:sequence>
         <!-- 'd.val' is the target node of 'theKey' -->
         <xsd:element ref="d.val" minOccurs="0" maxOccurs="unbounded"/>
       </xsd:sequence>
     </xsd:complexType>
     <xsd:key name="theKey">
       <xsd:selector xpath="f:d.val"/>
       <xsd:field xpath="f:val.1"/>
       <xsd:field xpath="f:val.2"/>
     </xsd:key>
   </xsd:element>

   <!-- 'd.val' is the target node of 'theKey' -->
   <xsd:element name="d.val">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="val.1"/>
         <xsd:element ref="val.2" minOccurs="0"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <!-- 'e' is the target node of 'theKeyref' -->
   <xsd:element name="e">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="val.1"/>
         <xsd:element ref="val.2"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <!-- elements holding the key values -->
   <xsd:element name="val.1" type="xsd:string"/>
   <xsd:element name="val.2" type="xsd:string"/>
</xsd:schema>

file: idc1_0.xml
----------------
<?xml version="1.0"?>
<r xmlns="http://FOO"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://FOO idc1_0.xsd">
   <a> <!-- 'a' is the scoping element of 'theKeyref' -->
     <d>
       <c> <!-- 'c' is the scoping element of 'theKey' -->
         <d.val>
           <val.1>3</val.1>
           <val.2>4</val.2>
         </d.val>
       </c>
       <b>
         <c>
           <d.val>
             <!-- key-sequence of 'theKey' -->
             <val.1>1</val.1> <!-- key value no. 1 of 'theKey' --> 

             <val.2>2</val.2> <!-- key value no. 2 of 'theKey' --> 

           </d.val>
           <d.val>
             <!-- key-sequence of 'theKey' -->
             <val.1>3</val.1>
             <val.2>4</val.2>
           </d.val>
         </c>
         <c>
           <d.val>
             <!-- key-sequence of 'theKey' -->
             <val.1>1</val.1>
             <val.2>2</val.2>
           </d.val>
           <d.val>
             <!-- key-sequence of 'theKey' -->
             <val.1>3</val.1>
             <val.2>4</val.2>
           </d.val>
         </c>
       </b>
     </d>

     <e> <!-- 'e' is the target node of 'theKeyref' -->
       <val.1>3</val.1> <!-- key value no. 1 of 'theKeyref' -->
       <val.2>4</val.2> <!-- key value no. 2 of 'theKeyref' -->
     </e>
   </a>
</r>

Received on Friday, 3 December 2004 13:40:40 UTC