W3C home > Mailing lists > Public > xmlschema-dev@w3.org > January 2013

Re: keyref to a key in a different scope

From: Mukul Gandhi <gandhi.mukul@gmail.com>
Date: Mon, 14 Jan 2013 21:45:16 +0530
Message-ID: <CABuuzNN=NGYhtJ3OZgTeg=TG5WoW6+Cv8xvsZja7GToYF20A7w@mail.gmail.com>
To: George Cristian Bina <george@oxygenxml.com>
Cc: xmlschema-dev@w3.org
Hi George,
    As a workaround, with XSD 1.1 we can write an assertion on the
complexType of element "parent" as follows:

<xs:assert test="every $tst in test satisfies $tst/@ref =
child/element/@id"/>

This kind of simulates the keyref you've written.

On Mon, Jan 14, 2013 at 6:46 PM, George Cristian Bina
<george@oxygenxml.com>wrote:

> Hi all,
>
> I have problems identifying the relevant parts of the XML Schema spec that
> apply to the following example. There is a key defined on the "child"
> element selecting the "element/@id" attribute and a key reference defined
> on the "parent" element that specifies that "test/@ref" points to
> "child/element/@id" attributes:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <parent xmlns:xsi="http://www.w3.org/**2001/XMLSchema-instance<http://www.w3.org/2001/XMLSchema-instance>
> "
>  xsi:noNamespaceSchemaLocation=**"test.xsd">
>     <child>
>         <element id="a1"/>
>         <element id="a2"/>
>     </child>
>     <child>
>         <element id="a1"/>
>         <element id="a4"/>
>     </child>
>     <test ref="a2"/>
>     <test ref="a1"/>
> </parent>
>
> test.xsd:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs="http://www.w3.org/**2001/XMLSchema<http://www.w3.org/2001/XMLSchema>"
> elementFormDefault="qualified"**>
>   <xs:element name="parent">
>     <xs:complexType>
>       <xs:sequence>
>         <xs:element name="child" maxOccurs="unbounded">
>           <xs:complexType>
>             <xs:sequence maxOccurs="unbounded">
>               <xs:element name="element">
>                 <xs:complexType>
>                   <xs:attribute name="id" use="required"/>
>                 </xs:complexType>
>               </xs:element>
>             </xs:sequence>
>           </xs:complexType>
>           <xs:key name="k">
>             <xs:selector xpath="element"/>
>             <xs:field xpath="@id"/>
>           </xs:key>
>         </xs:element>
>         <xs:element name="test" maxOccurs="unbounded">
>           <xs:complexType>
>             <xs:attribute name="ref"/>
>           </xs:complexType>
>         </xs:element>
>       </xs:sequence>
>     </xs:complexType>
>     <xs:keyref name="kr" refer="k">
>       <xs:selector xpath="test"/>
>       <xs:field xpath="@ref"/>
>     </xs:keyref>
>   </xs:element>
> </xs:schema>
>
> Xerces seems to discard all the key defined on "child" elements except the
> ones defined on the last "child" element, in the example only the "a1" and
> "a4" values are used when the keyref is checked.
>
> Saxon EE keeps all the key values, each set on its key space (that is each
> "child" element) and it triggers an error on the reference to a key that is
> defined in both "child" elements, the reference to "a1".
>
> My feeling is that Xerces is wrong and Saxon is correct but as I mentioned
> I cannot identify in the specification the relevant sections for this
> situation.
>
> Here there are the errors reported by Saxon
>
> System ID: /Users/george/Documents/test/**validation/instance1.xml
> Main validation file: /Users/george/Documents/test/**
> validation/instance1.xml
> Schema: /Users/george/Documents/test/**validation/test.xsd
> Engine name: Saxon-EE 9.4.0.6
> Severity: fatal
> Description: More than one referenced value found for keyRef {kr}
>     "a1"
> Start location: 9:27
>
> System ID: /Users/george/Documents/test/**validation/instance1.xml
> Main validation file: /Users/george/Documents/test/**
> validation/instance1.xml
> Schema: /Users/george/Documents/test/**validation/test.xsd
> Engine name: Saxon-EE 9.4.0.6
> Severity: fatal
> Description: More than one referenced value found for keyRef {kr}
>     "a1"
> Start location: 10:36
>
> System ID: /Users/george/Documents/test/**validation/instance1.xml
> Main validation file: /Users/george/Documents/test/**
> validation/instance1.xml
> Schema: /Users/george/Documents/test/**validation/test.xsd
> Engine name: Saxon-EE 9.4.0.6
> Severity: fatal
> Description: More than one referenced value found for keyRef {kr}: "a1"
> Start location: 5:0
>
> and here it is the error reported by Xerces:
>
> System ID: /Users/george/Documents/test/**validation/instance1.xml
> Main validation file: /Users/george/Documents/test/**
> validation/instance1.xml
> Schema: /Users/george/Documents/test/**validation/test.xsd
> Engine name: Xerces
> Severity: error
> Description: cvc-identity-constraint.4.3: Key 'kr' with value 'a2' not
> found for identity constraint of element 'parent'.
> Start location: 14:10
> URL: http://www.w3.org/TR/**xmlschema-1/#cvc-identity-**constraint<http://www.w3.org/TR/xmlschema-1/#cvc-identity-constraint>
>
> Best Regards,
> George
> --
> George Cristian Bina
> <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
> http://www.oxygenxml.com
>
>


-- 
Regards,
Mukul Gandhi
Received on Monday, 14 January 2013 16:16:08 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 14 January 2013 16:16:08 GMT