RELAX NG by Eric van der Vlist will be published by O'Reilly & Associates (ISBN: 0596004214)
You are welcome to use our annotation system to give your feedback.
In the preceding example we combined a choice pattern with a group pattern. This process can be expanded so that we can say that there is virtually no restriction or limit in the way compositors can be combined. As an example, let's say we want our character element to allow either one name element or the three elements first-name, middle-name (optional) and last-name in any order but require that they appear before the born and qualification elements. To do that, we write:
<element name="character"> <attribute name="id"/> <choice> <element name="name"><text/></element> <interleave> <element name="first-name"><text/></element> <optional> <element name="middle-name"><text/></element> </optional> <element name="last-name"><text/></element> </interleave> </choice> <element name="born"><text/></element> <element name="qualification"><text/></element> </element> |
or, with the compact syntax:
element character { attribute id {text}, ( element name {text}| ( element first-name {text}& element middle-name {text} ? & element last-name {text} ) ) |
Note that we have added two levels of parentheses here. In the compact syntax, operators are used to determine the nature of compositors ("group", "interleave" or "choice"). Operators cannot be mixed within one set of parentheses or curly brackets, so we need to use these parentheses to explicitly mark where each of the compositors begins and ends.
These schemas will validate any of the following (and varied) character elements:
<character id="PP"> <first-name>Peppermint</first-name> <last-name>Patty</last-name> <born>1966-08-22</born> <qualification>bold, brash and tomboyish</qualification> </character> <character id="PP2"> <last-name>Patty</last-name> <first-name>Peppermint</first-name> <born>1966-08-22</born> <qualification>bold, brash and tomboyish</qualification> </character> <character id="Snoopy"> <name>Snoopy</name> <born>1950-10-04</born> <qualification>extroverted beagle</qualification> </character> <character id="Snoopy2"> <first-name>Snoopy</first-name> <middle-name>the</middle-name> <last-name>Dog</last-name> <born>1950-10-04</born> <qualification>extroverted beagle</qualification> </character> <character id="Snoopy3"> <middle-name>the</middle-name> <last-name>Dog</last-name> <first-name>Snoopy</first-name> <born>1950-10-04</born> <qualification>extroverted beagle</qualification> </character> |
The flexibility and freedom with which we can combine patterns and the lack of restrictions associated with these combinations sets RELAX NG apart from other XML schema languages.
You are welcome to use our annotation system to give your feedback.
[Annotations for this page]
All text is copyright Eric van der Vlist, Dyomedea. During development, I give permission for non-commercial copying for educational and review purposes. After publication, all text will be released under the Free Software Foundation GFDL.