Page 1 of 1

multi-field key/keyref fails to contrain?

Posted: Tue Nov 09, 2004 11:25 pm
by DazedAndConfused
Please tell me if I am missing something here. I have a schema with a 2-field key and also a keyref. These are defined at the scope of their common predecessor. The below schema validates with the below instance, when no proper pair of (1,2) exists. Is this a bug or am I thinking wrongheadedly? Thanks.

SCHEMA:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="ConstraintScope">
<xs:complexType>
<xs:sequence>
<xs:element name="Path1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Key1" type="xs:integer"/>
<xs:element name="Key2" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Path2Parent">
<xs:complexType>
<xs:sequence>
<xs:element name="Path2Child" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="FKey1" type="xs:integer"/>
<xs:element name="FKey2" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="Path1Keys">
<xs:selector xpath="Path1"/>
<xs:field xpath="Key1"/>
<xs:field xpath="Key2"/>
</xs:key>
<xs:keyref name="Path2KeyRef" refer="Path1Keys">
<xs:selector xpath="Path2Parent/Path2Child"/>
<xs:field xpath="FKey1"/>
<xs:field xpath="FKey2"/>
</xs:keyref>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>


INSTANCE DOC:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KeyConstraints.xsd">
<ConstraintScope>
<Path1>
<Key1>1</Key1>
<Key2>1</Key2>
</Path1>
<Path1>
<Key1>2</Key1>
<Key2>2</Key2>
</Path1>
<Path2Parent>
<Path2Child>
<FKey1>1</FKey1>
<FKey2>2</FKey2>
</Path2Child>
<Path2Child>
<FKey1>2</FKey1>
<FKey2>2</FKey2>
</Path2Child>
</Path2Parent>
</ConstraintScope>
</Root>

The first Path2Parent/Path2Child sequence should not validate should it?!?

Posted: Wed Nov 10, 2004 3:27 pm
by george
Hi,

<oXygen/> uses the latest Xerces (2.6.2) for validating XML documents against XML Schemas. The problem you encountered is a known issue [1] and it was already resolved in Xerces CVS. I compiled the current CVS version and uploaded the xercesImpl jar [2] on our website so you can replace the one from oXygen with this one in order to get this fix.

[1] http://nagoya.apache.org/jira/browse/XERCESJ-1000
[2] http://www.oxygenxml.com/update/xercesImpl.jar

Best Regards,
George

Thanks!

Posted: Wed Nov 10, 2004 4:47 pm
by DazedAndConfused
Awesome. Got it, tried it, it works great. Thanks, George! :D

Identity Constraint error: key out of scope

Posted: Wed Mar 09, 2005 3:40 pm
by reto.koenig
After having bought the Oxygen5.1 License, I tried to create a simple schema and according to it an xml-file. But I always got the same error:
Identity Constraint error: identity constraint "KeyRef@..." has a keyref which refers to a key or unique that is out of scope

But validated with XML-Spy it said: This dokument is valid.

So where am I missing a point?

Schema:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:import namespace="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="xsi.xsd"/>
<xs:element name="SchoolScheduler">
<xs:complexType>
<xs:sequence>
<xs:element ref="Lessons"/>
<xs:element ref="Teachers"/>
<xs:element ref="Timeblocks"/>
</xs:sequence>
<xs:attribute ref="xsi:noNamespaceSchemaLocation" use="required"/>
</xs:complexType>
<xs:key name="timeblockKey">
<xs:selector xpath="./Timeblocks/Timeblock"/>
<xs:field xpath="@from"/>
</xs:key>
<xs:key name="teacherKey">
<xs:selector xpath="./Teachers/Teacher"/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:element name="Lessons">
<xs:complexType>
<xs:sequence>
<xs:element ref="Lesson"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Lesson">
<xs:complexType>
<xs:attribute name="timeRef" type="xs:time" use="required"/>
<xs:attribute name="teacherRef" type="xs:string" use="required"/>
</xs:complexType>
<xs:keyref name="lessonTimeRef" refer="timeblockKey">
<xs:selector xpath="."/>
<xs:field xpath="@timeRef"/>
</xs:keyref>
<xs:keyref name="lessonTeacherRef" refer="teacherKey">
<xs:selector xpath="."/>
<xs:field xpath="@teacherRef"/>
</xs:keyref>
</xs:element>
<xs:element name="Teachers">
<xs:complexType>
<xs:sequence>
<xs:element ref="Teacher"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Teacher">
<xs:complexType>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Timeblocks">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Timeblock"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Timeblock">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:time"/>
</xs:sequence>
<xs:attribute name="from" use="required" type="xs:time"/>
</xs:complexType>
</xs:element>
</xs:schema>

xml-Sample:
<?xml version="1.0" encoding="UTF-8"?>
<SchoolScheduler xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="2005-small.xsd">
<Lessons>
<Lesson timeRef="08:20:00" teacherRef="Alain Rohr"/>
</Lessons>
<Teachers>
<Teacher name="Alain Rohr"/>
</Teachers>
<Timeblocks>
<Timeblock from="08:20:00">
<to>09:15:00</to>
</Timeblock>
<Timeblock from="09:20:00">
<to>10:00:00</to>
</Timeblock>
</Timeblocks>
</SchoolScheduler>

Posted: Wed Mar 09, 2005 5:03 pm
by george
Hi,

While in the case of DTD the scope of the ID and IDREF/IDREFS is the whole document the XML Schema allows the scope to be restricted to an element. Moving the keyref from Lesson to SchoolScheduler where you have also the key should make them in the same scope. Also please note that there is no need to import a schema for the schema instance namespace and to define the xsi:noNamespaceSchemaLocation attribute.

The final schema is:

Code: Select all


<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:element name="SchoolScheduler">
<xs:complexType>
<xs:sequence>
<xs:element ref="Lessons"/>
<xs:element ref="Teachers"/>
<xs:element ref="Timeblocks"/>
</xs:sequence>
</xs:complexType>
<xs:key name="timeblockKey">
<xs:selector xpath="./Timeblocks/Timeblock"/>
<xs:field xpath="@from"/>
</xs:key>
<xs:key name="teacherKey">
<xs:selector xpath="./Teachers/Teacher"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="lessonTimeRef" refer="timeblockKey">
<xs:selector xpath="Lessons/Lesson"/>
<xs:field xpath="@timeRef"/>
</xs:keyref>
<xs:keyref name="lessonTeacherRef" refer="teacherKey">
<xs:selector xpath="Lessons/Lesson"/>
<xs:field xpath="@teacherRef"/>
</xs:keyref>
</xs:element>
<xs:element name="Lessons">
<xs:complexType>
<xs:sequence>
<xs:element ref="Lesson"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Lesson">
<xs:complexType>
<xs:attribute name="timeRef" type="xs:time" use="required"/>
<xs:attribute name="teacherRef" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Teachers">
<xs:complexType>
<xs:sequence>
<xs:element ref="Teacher"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Teacher">
<xs:complexType>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Timeblocks">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Timeblock"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Timeblock">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:time"/>
</xs:sequence>
<xs:attribute name="from" use="required" type="xs:time"/>
</xs:complexType>
</xs:element>
</xs:schema>
HTH,
George

Posted: Wed Mar 09, 2005 6:08 pm
by reto.koenig
Hey George

You were perfectly right! That's exactly where I went wrong!
Thank you very much...

(I have to admit to myself, that a fool with a tool* is still a fool :oops:)

*(Even if the tool is almost fool-proof)

Posted: Mon Jun 20, 2005 11:50 am
by emil
Hi George,
<oXygen/> uses the latest Xerces (2.6.2) for validating XML documents against XML Schemas. The problem you encountered is a known issue [1] and it was already resolved in Xerces CVS. I compiled the current CVS version and uploaded the xercesImpl jar [2] on our website so you can replace the one from oXygen with this one in order to get this fix.

[1] http://nagoya.apache.org/jira/browse/XERCESJ-1000
[2] http://www.oxygenxml.com/update/xercesImpl.jar
The problem still persists. I downloaded <oXygen/> 6.0 build 2005051805 and it doesn't catch the situation described in the first post in this topic. Unfortunately the link that you gave to xercesImpl.jar file is not working anymore.

I downloaded the last Xerces implementation form their CVS and build it, but <oXygen/> doesn't like it and complains with this message.

Do you have an idea how this problem can be resolved?

Best regards,
Emil.

Posted: Mon Jun 20, 2005 1:31 pm
by george
Hi Emil,

Xerces 2.7.0 is planned to be released this week. It will be integrated in oXygen 6.1 that will be available shortly after that.

Best Regards,
George