Using XML Schema to Force At Least One Item?

K

Kenneth Love

Sorry if this is a newbie question. I couldn't get the correct magic
incantation for Google to get an answer. :-(

I'm trying to satisfy a requirement that "at least one of the following
*must* be present" in an XML Schema. I have come up with two examples
that almost work.

Here's the first:

<xs:element name="LightExample1" maxOccurs="3">
<xs:complexType>
<xs:choice>
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
</xs:complexType>
</xs:element>

This doesn't work because it allows multiple A, B, or C elements.

Here's the second example:

<xs:element name="LightExample2">
<xs:complexType>
<xs:sequence>
<xs:element name="A" minOccurs="0"/>
<xs:element name="B" minOccurs="0"/>
<xs:element name="C" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>

This *almost* works. The only problem is that it allows an empty
<LightExample2/> element which fails the "at least one of" portion of
the requirement.

Is it possible to do this?

Kenneth
 
M

Martin Honnen

Kenneth said:
I'm trying to satisfy a requirement that "at least one of the following
*must* be present" in an XML Schema. I have come up with two examples
that almost work.

Here's the first:

<xs:element name="LightExample1" maxOccurs="3">
<xs:complexType>
<xs:choice>
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
</xs:complexType>
</xs:element>

This doesn't work because it allows multiple A, B, or C elements.

Why do multiple elements conflict with your sole requirement "at least
one of the following *must* be present"?
 
K

Kenneth Love

Okay. I guess I left out the requirement that no more than one of each
element A, B, or C can appear in the result.

ABC is valid. C is valid. AA is not. CBC is not.

The order is not that important to me. If I was provided a solution
forcing the elements to be in a certain order then that's okay. It's
okay if the solution provides for the elements to be in any order. I
would prefer the former, actually.

I could write a regular expression like this:

RE = (A, B?, C?) | (A?, B, C?) | (A?, B?, C)

Any thoughts?

adTHANKSvance,
Kenneth Love
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,999
Messages
2,570,246
Members
46,839
Latest member
MartinaBur

Latest Threads

Top