- From: Gopal Sharma <Gopal.Sharma@Sun.COM>
- Date: Mon, 25 Feb 2002 17:15:26 +0530 (IST)
- To: jeni@jenitennison.com, Home@LeeGoddard.com
- Cc: xmlschema-dev@w3.org
jeni tennison wrote:-
> Hi Lee,
>
> > Section 2.2.3 ("Naming Conflicts") of XML Schema Part 0: Primer
> > seems to suggest to me that the only way I can define an element as
> > either one thing or another is by using different namespaces.
> >
> > Am I correct in thinking this or is there a more elegant solution?
>
> There is a more elegant solution, although it does involve changing
> the XML instances (but then, so would using different namespaces).
>
> The content and attributes of an element are its type, so what you're
> asking here is about saying that an element can either be one type or
> another type.
>
> You can do this by creating two, related, complex types; with your
> example, since the name element has to come first, I think that
> easiest way is to create an abstract type that allows both a name
> attribute and a name child element, and then restrict it to make the
> two types that you actually want, as follows:
>
> <xs:complexType name="abstractListType" abstract="true">
> <xs:sequence>
> <xs:element name="name" type="xs:string" minOccurs="0" />
> <xs:element name="data" type="xs:string" />
> </xs:sequence>
> <xs:attribute name="name" type="xs:string" />
> </xs:complexType>
>
> <xs:complexType name="attributeListType">
> <xs:complexContent>
> <xs:restriction base="generalListType">
^^^^^^^^^^^^^^^^
I think, it's just a typo. It should be
abstractListType.
Cheers
Gopal
-----
> <xs:sequence>
> <xs:element name="data" type="xs:string" />
> </xs:sequence>
> <xs:attribute name="name" type="xs:string" use="required" />
> </xs:restriction>
> </xs:complexContent>
> </xs:complexType>
>
> <xs:complexType name="elementListType">
> <xs:complexContent>
> <xs:restriction base="generalListType">
> <xs:sequence>
> <xs:element name="name" type="xs:string" />
> <xs:element name="data" type="xs:string" />
> </xs:sequence>
> <xs:attribute name="name" type="xs:string" use="prohibited" />
> </xs:restriction>
> </xs:complexContent>
> </xs:complexType>
>
> When you define the list element, give it the abstract type as its
> type:
>
> <xs:element name="list" type="abstractListType" />
>
> Now, the list element in the instance cannot actually be of the
> abstract list type because it's abstract, so it must be of one of the
> derived types. For each list element in the instance, you have to
> indicate the type of list it is, using the xsi:type attribute, for
> example:
>
> <list xsi:type="elementListType">
> <name>foo</name>
> <data>bar</data>
> </list>
> or
> <list xsi:type="attributeListType" name="foo">
> <data>bar</data>
> </list>
>
> You could do a similar thing, but changing the names of the elements,
> using substitution groups, but I imagine that that's not an option
> (since if they could have different names there wouldn't be this
> problem anyway).
>
> If you can't change the instances by adding xsi:type attributes, then
> I don't think that there's a way to articulate the constraint using
> XML Schema. In that case, you should make the abstract type
> non-abstract, and use that as the list type, and write the other
> constraints in another way (e.g. using Schematron rules, a RELAX NG
> grammar or just in natural language documentation as you would with a
> DTD).
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
Received on Monday, 25 February 2002 06:45:39 UTC