- From: Kasimier Buchcik <kbuchcik@4commerce.de>
- Date: Tue, 14 Dec 2004 12:32:10 +0100
- To: Jim Stanley <JimS@Media-Services.Com>
- CC: xmlschema-dev@w3.org
Hi, Jim Stanley wrote: > Just when I think I understand all this key/keyref stuff, another > conundrum arises: > > I have "categories" under my root, each with one or more "property > definitions" consisting of name-value pairs. Several of my categories > have duplicate property definitions, something like below: > > <root> > <category> > <name>Foo</name> > <propDef> > <name>Color</name> > <type>integer</type> > </propDef> > <propDef> > <name>Flavor</name> > <type>String</type> > </propDef> > <category> > <category> > <name>Bar</name> > <propDef> > <name>Color</name> > <type>integer</type> > </propDef > <propDef> > <name>Odor</name> > <type>String</type> > </propDef> > </category> > </root> > > If I define a primary key as follows: > > <xs:key name="catElem.PK"> > <xs:selector xpath="category/propDef"/> > <xs:field xpath="name"/> > </xs:key> > > XMLSpy tells me that the duplicate value "Color" has been already > matched by the identity constraint. If I configure it like so: Here the target node is 'propDef'. The node-table being build on the <root> element looks like this: Node | Key-sequence ---------------------------- 1. <propDef> | 'Color' 2. <propDef> | 'Flavor' 3. <propDef> | 'Color' 4. <propDef> | 'Odor' The spec says: "4.2.2 No two members of the ·qualified node set· have ·key-sequences· whose members are pairwise equal, as defined by Equal in [XML Schemas: Datatypes]." ... this is not satisfied, since the key sequences of 1. and 3. are equal. > <xs:key name="catElem.PK"> > <xs:selector xpath="category"/> > <xs:field xpath="propDef/name"/> > </xs:key> > > it tells me that the field "propDef/name" matches twice within the > scope of element 'category'. Here the target node is 'category', this element as the context node for the XPath of the field, resolves _two_ times to a node. This is ruled out by: "3 For each node in the ·target node set· all of the {fields}, with that node as the context node, evaluate to either an empty node-set or a node-set with exactly _one_ member, which must have a simple type... " > I don't get this. I thought after the last go-round that using just > 'category' as the field selector created an automatic unique constraint > per category. I need to make sure that the combination of category name > *plus* propDef/name (Foo + Color) is unique. Can someone shed some > light (again?) I don't see a way to do this, since you want only the _first_ 'propDef' child element of the 'category' element to be used as a field. This is not expressible by the reduced XPath syntax of the indentity-constraint mechanism. In your example the XPath 'propDef/name' resolves to multiple nodes, which is not allowed. What you would need, would be 'propDef/name[1]' - unfortunately not supported. If there was only one 'profDef' child, the following would create a key, consisting of both 'name' values. <xs:key name="catElem.PK"> <xs:selector xpath="category"/> <xs:field xpath="name"/> <xs:field xpath="propDef/name"/> </xs:key> Cheers, Kasimier
Received on Tuesday, 14 December 2004 11:32:58 UTC