Basically, the XHTML standard introduces two content models: inline and block. The inline elements affect individual text elements, whereas the block elements affect entire blocks of text. These two elements are then used as child elements for other elements.
Inline entities and elements
The XHTML standard provides the following declarations for defining a series of internal parameter entities to be used to define the inline elements:
<!ENTITY % special "br | span | img"> <!ENTITY % fontstyle "tt | i | b | big | small"> <!ENTITY % phrase "em | strong | q | sub | sup"> <!ENTITY % inline.forms "input | select | textarea | label | button"> <!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;"> <!-- Entities that can occur at block or inline level. --> <!ENTITY % misc "script | noscript"> <!ENTITY % Inline " (#PCDATA | %inline; | %misc; )*">
This declaration fragment builds the final Inline parameter entity in small pieces. Notice that the Inline entity definition contains the inline and misc entities and uses the technique described in Chapter 4 for including an unlimited number of child elements in any order-in this example, using (#PCDATA | %inline; | %misc; )*.
In the example DTD created in Chapters 3 and 4, the p element was used to organize the content within a cell. Although that usage makes sense, the purpose of the p element is to make text that is not included in a block element (such as text within an h element) word-wrap properly. Therefore, putting the h element or any of the block elements within a p element is not necessary because text within a block element is already word-wrapped. On the other hand, if any of the inline elements are used outside of a block element, they should be placed inside a p element so that the text element wraps properly. Therefore, you could rewrite the definition for the p element as follows:
<!ELEMENT p %Inline;>
This shows exactly the way the definition for the p element appears in the XHTML specification.
Block entities and elements
The XHTML standard also declares a set of internal parameter entities that can be used in the declarations of the block elements. These internal parameter entities appear as follows:
<!ENTITY % heading "h1 | h2 | h3 | h4 | h5 | h6"> <!ENTITY % lists "ul | ol"> <!ENTITY % blocktext "hr | blockquote"> <!ENTITY % block "p | %heading; | div | %lists; | %blocktext; | fieldset | table"> <!ENTITY % Block " (%block; | form | %misc; )*">
Notice that the Block entity contains the block entity, the misc entity, and the form element and also includes an unlimited number of these child elements in any order. Using the Block parameter entity, the declaration for the body element becomes the following:
<!ELEMENT body %Block;>
As you can see, using the parameter entities, you can give your document a clear structure.
Using parameter entities in attributes
The XHTML standard also uses parameter entities in attributes, as we saw earlier with the events entity. You could use this events entity and two additional entities to create an internal parameter entity for attributes shared among many elements, as shown here:
<!-- Internationalization attributes lang Language code (backward-compatible) xml:lang Language code (per XML 1.0 spec) dir Direction for weak/neutral text --> <!ENTITY % i18n " lang NMTOKEN #IMPLIED xml:lang NMTOKEN #IMPLIED dir (ltr | rtl ) #IMPLIED"> <!ENTITY % coreattrs " id ID #IMPLIED class CDATA #IMPLIED style CDATA #IMPLIED title CDATA #IMPLIED"> <!ENTITY % attrs " %coreattrs; %i18n; %events;">
The language entity i18n can be understood by XML and non-XML compliant browsers and is used to mark elements as belonging to a particular language.
For more information about language codes, visit the Web site http://www.oasis-open.org/cover/iso639a.html
.
The attrs parameter entity can be used for the most common attributes associated with the HTML elements in the DTD. For example, the body element's attribute can now be written as follows:
<!ATTLIST body %attrs; onload CDATA #IMPLIED onunload CDATA #IMPLIED>