- From: Kasimier Buchcik <kbuchcik@4commerce.de>
- Date: Fri, 03 Dec 2004 14:40:03 +0100
- To: Sharon Krisher <sharonkr@netvision.net.il>
- CC: xmlschema-dev@w3.org
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