469,623 Members | 1,238 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,623 developers. It's quick & easy.

XML Schema question

Hi--I am having a problem designing a schema to fit my XML data, and I'm
hoping that someone can help. Essentially, I have a schema in mind and two
target vocabularies for it, where one vocabulary is a subset of the other. I
will describe one part of the schema to give you an idea of what my problem
is.

The "big" schema calls for 0 or more selector elements, each containing a
(required) name attribute and simple character data, as follows:

<selector name="wakka">foo</selector>

The "small" schema calls for 1 or more selector elements with a name of
"key", followed by 0 or more selector elements with any value for the name
attribute:

<selector name="key">estimate</selector>

<selector name="key">summary</selector>

<selector name="custom1">low-priority</selector>

As you can see, the small schema is a subset of the large schema.

My problem is that I can't find a way to define a parent element than can
describe the sequence of selector elements required by the small schema.
I've looked at redefinition, substitution groups, and other tricks for
making a schema open-ended. The problem is that they all require me to write
something like the following within a complex type definition:

<xsd:sequence>

<xsd:element maxOccurs="unbounded" minOccurs="1" name="selector"
type="selectorKeyType"/>

<xsd:element maxOccurs="unbounded" minOccurs="0" name="selector"
type="selectorType"/>

</xsd:sequence>

....where selectorKeyType and selectorType are defined as follows:

<xsd:complexType name="selectorType">

<xsd:simpleContent>

<xsd:extension base="xsd:token">

<xsd:attribute name="name" type="xsd:NCName"/>

</xsd:extension>

</xsd:simpleContent>

</xsd:complexType>

<!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->

<xsd:complexType name="selectorKeyType">

<xsd:simpleContent>

<xsd:restriction base="selectorType">

<xsd:attribute fixed="key" name="name" type="xsd:NCName"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

The Xerxes parser reminds me that multiple elements with the same name must
have the same type:

[Message:E cos-element-consistent: Error for type '<ignore --gw>'. Multiple
elements with name 'selector', with different types, appear in the model
group. SystemID:file:/C:/xml/misc/schema-experiments/exper3/exper.xsd,
Line:35, Column:34, Offset:-1]

Of course, I could write my own code that would validate a given XML file
has been valid under the little schema, but the differences between the big
and little schemas are considerable. I could also describe the constrained
selector element using a slightly different name--cselector, for
example--but that would more or less negate the original design: namely,
that custom elements are distinguished from "official" elements only by the
value of the name attribute.

Is there a way to do what I want to do? Or is the inability of the XML
Schema to handle this situation an indication that what I am trying to do is
a Bad Thing? Thanks.

--gw
Jul 20 '05 #1
1 2474

"Gregg Williams" <gr****@NOSPAMpubspace.com> wrote in message
news:vk************@corp.supernews.com...
Hi--I am having a problem designing a schema to fit my XML data, and I'm
hoping that someone can help. Essentially, I have a schema in mind and two
target vocabularies for it, where one vocabulary is a subset of the other. I will describe one part of the schema to give you an idea of what my problem is.

The "big" schema calls for 0 or more selector elements, each containing a
(required) name attribute and simple character data, as follows:

<selector name="wakka">foo</selector>

The "small" schema calls for 1 or more selector elements with a name of
"key", followed by 0 or more selector elements with any value for the name
attribute:

<selector name="key">estimate</selector>

<selector name="key">summary</selector>

<selector name="custom1">low-priority</selector>
Can't do this. Elements with the same name in a sequence must have the same
type.

And (reading ahead a bit) you already know this! The Xerces parser told you
so.

Redesign your data model (which looks like a good idea in this case) or use
a more expressive schema language, like RELAX NG.

Bob Foster
As you can see, the small schema is a subset of the large schema.

My problem is that I can't find a way to define a parent element than can
describe the sequence of selector elements required by the small schema.
I've looked at redefinition, substitution groups, and other tricks for
making a schema open-ended. The problem is that they all require me to write something like the following within a complex type definition:

<xsd:sequence>

<xsd:element maxOccurs="unbounded" minOccurs="1" name="selector"
type="selectorKeyType"/>

<xsd:element maxOccurs="unbounded" minOccurs="0" name="selector"
type="selectorType"/>

</xsd:sequence>

...where selectorKeyType and selectorType are defined as follows:

<xsd:complexType name="selectorType">

<xsd:simpleContent>

<xsd:extension base="xsd:token">

<xsd:attribute name="name" type="xsd:NCName"/>

</xsd:extension>

</xsd:simpleContent>

</xsd:complexType>

<!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->

<xsd:complexType name="selectorKeyType">

<xsd:simpleContent>

<xsd:restriction base="selectorType">

<xsd:attribute fixed="key" name="name" type="xsd:NCName"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

The Xerxes parser reminds me that multiple elements with the same name must have the same type:

[Message:E cos-element-consistent: Error for type '<ignore --gw>'. Multiple elements with name 'selector', with different types, appear in the model
group. SystemID:file:/C:/xml/misc/schema-experiments/exper3/exper.xsd,
Line:35, Column:34, Offset:-1]

Of course, I could write my own code that would validate a given XML file
has been valid under the little schema, but the differences between the big and little schemas are considerable. I could also describe the constrained
selector element using a slightly different name--cselector, for
example--but that would more or less negate the original design: namely,
that custom elements are distinguished from "official" elements only by the value of the name attribute.

Is there a way to do what I want to do? Or is the inability of the XML
Schema to handle this situation an indication that what I am trying to do is a Bad Thing? Thanks.

--gw

Jul 20 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by Antony | last post: by
2 posts views Thread by PeterW | last post: by
4 posts views Thread by cmc | last post: by
1 post views Thread by brucepickford001 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.