Re: Illegal use of unique? I need it. Microsoft supports it. Alternatives?

> > <xs:complexType name="ObjectType">
> >   <xs:complexContent>
> >   <xs:extension base="AbstractElementType">
> >     <xs:sequence>
> >       <xs:element name="State" type="StateType" minOccurs="0"
> > maxOccurs="unbounded">
>
> This is invalid! "xs:unique" should come after xs:sequence as a direct
> child of xs:element.
>
> >       <xs:unique name="StateNamesUniqueWithinAnObject">
> >       <xs:selector xpath="../State"/>
> >       <xs:field xpath="@name"/>
> >       </xs:unique>
> >       </xs:element>
> >     </xs:sequence>
> >   </xs:extension>
> >   </xs:complexContent>
> > </xs:complexType>
> >
> > However, note use of parent node syntax (..) in the selector xpath.
> > Is this illegal?
>
> Yes.
>
> > If so, how do I acheive my aim legally?
>
> By defining the xs:unique in the definition of your object element:
>
> <xs:element name="object">
>    .../...
>    <xs:unique name="singleStatePerObject">
>      <xs:selector xpath="State"/>
>      <xs:field xpath="@name"/>
>    </xs:unique>
> </xs:element>
>
> > I intend to
> > declare object instances at multiple points and levels in my schema
> > and it would be extremely onerous and poor software engineering
> > practice to have to attach a unique to every instance.
>
> I am not sure I understand what you mean here, but -good or bad software
> engineering practice- it's the way it needs to be defined by W3C XML
> Schema !

I think what Gary means is that the complexType "ObjectType" will be reused
as the type of many elements in the schema. This would mean that he would
have to add:

   <xs:unique name="singleStatePerObject">
     <xs:selector xpath="State"/>
     <xs:field xpath="@name"/>
   </xs:unique>

to every element that uses the ObjectType which can be a bit tedious.
Unfortunately, like Eric said, this is the way it needs to be defined and
there's not much we can do about it.
The only solution I can think of (which may not work for you) is to instead
of defining a complexType "ObjectType" you declare a global element "Object"
like this:

<xs:element name="Object"
  <xs:complexType>
    <xs:complexContent>
      <xs:extension base="AbstractElementType">
        <xs:sequence>
          <xs:element name="State" type="StateType" minOccurs="0"
maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:unique name="singleStatePerObject">
    <xs:selector xpath="State"/>
    <xs:field xpath="@name"/>
  </xs:unique>
</xs:element>

And then reference this global element at multiple places in your schema. The
drawback of course is that these elements will always be named "Object".

Cheers,
/Eddie

Received on Wednesday, 10 October 2001 19:52:45 UTC