Choices

Besides using sequences, you can use choices in DTDs. A choice lets you specify that one of a number of elements will appear at that particular location. Here's how a choice specifying one of the elements <a> or <b> or <c> looks: (a b c) . When you use this expression, the XML processor knows that exactly one of the <a> or <b> or <c> elements can appear.

I'll put choices to work in an example now. In this case, I'll specify that the <ITEM> element must enclose a <PRODUCT> element, a <NUMBER> element, and exactly one element from the list <PRICE> , <CHARGEACCT> , and <SAMPLE> :

Listing ch03_04.xml
 <?xml version = "1.0" standalone="yes"?> <!DOCTYPE DOCUMENT [ <!ELEMENT DOCUMENT (CUSTOMER)*> <!ELEMENT CUSTOMER (NAME,DATE,ORDERS)> <!ELEMENT NAME (LAST_NAME,FIRST_NAME)> <!ELEMENT LAST_NAME (#PCDATA)> <!ELEMENT FIRST_NAME (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT ORDERS (ITEM)*>  <!ELEMENT ITEM (PRODUCT, NUMBER, (PRICE  CHARGEACCT  SAMPLE))>  <!ELEMENT PRODUCT (#PCDATA)> <!ELEMENT NUMBER (#PCDATA)> <!ELEMENT PRICE (#PCDATA)> <!ELEMENT CHARGEACCT (#PCDATA)> <!ELEMENT SAMPLE (#PCDATA)> ]> <DOCUMENT>     <CUSTOMER>         <NAME>             <LAST_NAME>Smith</LAST_NAME>             <FIRST_NAME>Sam</FIRST_NAME>         </NAME>         <DATE>October 15, 2003</DATE>         <ORDERS>             <ITEM>  <PRODUCT>Tomatoes</PRODUCT>   <NUMBER>8</NUMBER>   <PRICE>.25</PRICE>  </ITEM>             <ITEM>  <PRODUCT>Oranges</PRODUCT>   <NUMBER>24</NUMBER>   <SAMPLE>.98</SAMPLE>  </ITEM>         </ORDERS>     </CUSTOMER>     <CUSTOMER>         <NAME>             <LAST_NAME>Jones</LAST_NAME>             <FIRST_NAME>Polly</FIRST_NAME>         </NAME>         <DATE>October 20, 2003</DATE>         <ORDERS>             <ITEM>  <PRODUCT>Bread</PRODUCT>   <NUMBER>12</NUMBER>   <CHARGEACCT>.95</CHARGEACCT>  </ITEM>             <ITEM>  <PRODUCT>Apples</PRODUCT>   <NUMBER>6</NUMBER>   <CHARGEACCT>.50</CHARGEACCT>  </ITEM>         </ORDERS>     </CUSTOMER>     <CUSTOMER>         <NAME>             <LAST_NAME>Weber</LAST_NAME>             <FIRST_NAME>Bill</FIRST_NAME>         </NAME>         <DATE>October 25, 2003</DATE>         <ORDERS>             <ITEM>  <PRODUCT>Asparagus</PRODUCT>   <NUMBER>12</NUMBER>   <PRICE>.95</PRICE>  </ITEM>             <ITEM>  <PRODUCT>Lettuce</PRODUCT>   <NUMBER>6</NUMBER>   <CHARGEACCT>.50</CHARGEACCT>  </ITEM>         </ORDERS>     </CUSTOMER> </DOCUMENT> 

As you might expect, you can use the + , * , and ? with choices as well. Here, I'm allowing one or more elements selected from a choice to appear in the <ITEM> elementand allowing the choice to return any number of <CHARGEACCT> elements:

 <?xml version = "1.0" standalone="yes"?>  <!DOCTYPE DOCUMENT [ <!ELEMENT DOCUMENT (CUSTOMER)*> <!ELEMENT CUSTOMER (NAME,DATE,ORDERS)> <!ELEMENT NAME (LAST_NAME,FIRST_NAME)> <!ELEMENT LAST_NAME (#PCDATA)> <!ELEMENT FIRST_NAME (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT ORDERS (ITEM)*>  <!ELEMENT ITEM (PRODUCT, NUMBER, (PRICE  CHARGEACCT*  SAMPLE)+)>  <!ELEMENT PRODUCT (#PCDATA)> <!ELEMENT NUMBER (#PCDATA)> <!ELEMENT PRICE (#PCDATA)> <!ELEMENT CHARGEACCT (#PCDATA)> <!ELEMENT SAMPLE (#PCDATA)> ]>     .     .     . 

As you can see, DTD syntax allows you to specify syntax fairly exactly (unless you want to specify a range on the number of times an element can appear or its exact data type, of course). In fact, there are two more content models that you can use as well: mixed-content models and empty-content models.



Real World XML
Real World XML (2nd Edition)
ISBN: 0735712867
EAN: 2147483647
Year: 2005
Pages: 440
Authors: Steve Holzner

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net