by Eric van der Vlist is published by O'Reilly & Associates (ISBN: 0596004214)
In the preceding example, we combined a choice pattern with a group pattern. This process can be expanded so that there is virtually no restriction or limit on 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, 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 })), element born { text }, element qualification { text } } |
Note that two levels of parentheses have been added. In the compact syntax, operators determine the nature of compositors (group, interleave, or choice). Operators can't be mixed within one set of parentheses or curly brackets, so you need to use these parentheses to explicitly mark where each compositor begins and ends.
These schemas 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 you can combine patterns and the lack of restrictions associated with these combinations sets RELAX NG apart from other XML schema languages.
This text is released under the Free Software Foundation GFDL.