[xsd-users] Problem with duplicate Ids

Boris Kolpackov boris at codesynthesis.com
Mon Dec 26 05:16:04 EST 2005


Mark,

BURGESS, Mark, FM <Mark.BURGESS at rbos.com> writes:

> I have now created a cut down complete example which exhibits the same
> problem.

Thanks for doing this. It was very helpful. This problem is an interesting
one. Here is the relevant code snippet:

 ExecutionEnvironment executionEnvironment ("ExecutionEnvironment:2");
 ExecutionOperation executionOperation ("ExecutionOperation:3",
                                        executionEnvironment.id ());

The second argument to ExecutionOperation's c-tor is of type
xml_schema::ncname. executionEnvironment.id () returns an instance of
the xml_schema::id type. xml_schema::id inherits from xml_schema::ncname.

The problem arises from the fact that all containers in the document
tree are polymorphism-aware . This means that they preserve dynamic
types of objects rather than only static types (like std:: containers
do). Here is what happens in the example above: the second argument
to ExecutionOperation has static type ncname and dynamic type id. The
c-tor implementation uses clone() function to make complete (dynamic)
copy of the object. As a result we end up with another instance of id
which contains "ExecutionEnvironment:2". Later when we try to insert
executionOperation into the tree we end up with the duplicate_id
exception because it conflicts with the executionEnvironment's id.

I agree this is somewhat unexpected in this particular case and I am
thinking of a way to make it less surprising. The fact that XML Schema
allows polymorphic behavior on any type (via xsi:type) will make it
hard to find a good solution to this problem.

A simple workaround for this problem is to pass a temporary of ncname
to ExecutionOperation c-tor, e.g.,

ExecutionOperation executionOperation (
  "ExecutionOperation:3",
  xml_schema::ncname (executionEnvironment.id ()));

Alternatively, you may want to change the type of the ref attribute from
NCName to IDREF.

hth,
-boris
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 652 bytes
Desc: Digital signature
Url : http://codesynthesis.com/pipermail/xsd-users/attachments/20051226/c3f9583d/attachment.pgp


More information about the xsd-users mailing list