RE: inquiry into the <choice> element behavior

> 
> Thanks for your prompt response.  If you could be so kind to 
> help me understand the result when the maxOccurs exists at 
> both the choice and the nested elements, it would be greatly 
> appreciated

I'm not sure how familiar you are with grammars and regular expressions.

In a regular expression, (a|b)* matches any string containing only a and b
characters, for example abab, aab, a, b, aaabbaabbb, and also the empty
string. By contrast, (a*|b*) matches a string consisting entirely of a's or
entirely of b's, for example aaaa or bbbb.

A maxOccurs="unbounded" on xs:element is like the "*" in a* or b*. A
maxOccurs on xs:choice is like the "*" after the parentheses.

> 
> <xs:choice maxOccurs="unbounded">
>      <xs:element name="foo" type="xs:string" maxOccurs="unbounded"/>
>      <xs:element name="bar" type="xs:string" 
> maxOccurs="unbounded"/> </xs:choice>
> 
> This would allow any number of both "foo" *and* "bar" 
> elements, right? 
> Does this contradict the purpose of the choice element to 
> begin with, or am I just misunderstanding the function of the 
> choice element?  In other words, how is scenario 2 different 
> than just having the elements on their own, without the 
> choice element?

You're asking how is (f*|b*)* different from f*b*? In the second case, all
the foo's have to come before the first bar. However, (f*|b*)* is equivalent
to (f|b)*, at least in the sense that it matches the same strings. (It might
match them in a different way, which can be relevant when using regexes).

Michael Kay
http://www.saxonica.com/

Received on Friday, 31 October 2008 17:15:24 UTC