home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  


Book HomeXML in a NutshellSearch this book

16.5. Empty Elements

In many cases, it is useful to declare an element that cannot contain anything. Most of these elements convey all of their information via attributes or simply by their position in relation to other elements (e.g., the br element from XHTML).

Let's add a contact-information element to the address element that will be used to contain a list of ways to contact a person. Example 16-8 shows the sample instance document after adding the new contacts element and a sample phone entry.

Example 16-8. addressdoc.xml with contact element

<?xml version="1.0"?>
<addr:address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://namespaces.oreilly.com/xmlnut/address 
      address-schema.xsd"
    xmlns:addr="http://namespaces.oreilly.com/xmlnut/address"
    addr:language="en">
  <addr:fullName>
    <addr:first>William</addr:first>
    <addr:middle>Scott</addr:middle>
    <addr:last>Means</addr:last>
  </addr:fullName>
  <addr:contacts>
    <addr:phone addr:label="888.737.1752"/>
  </addr:contacts>
</addr:address>

Supporting this new content requires further modifications to the schema document. Although it would be possible to declare the new element inline within the existing address-element declaration, for clarity it makes sense to create a new global type and reference it by name:

<xs:element name="address">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="fullName">
. . .
      </xs:element>
      <xs:element name="contacts" type="addr:contactsType" minOccurs="0"/>
    </xs:sequence>
  <xs:attributeGroup ref="addr:nationality"/>
  </xs:complexType>
</xs:element>

The declaration for the new contactsType complex type looks like this:

<xs:complexType name="contactsType">
  <xs:sequence>
    <xs:element name="phone" minOccurs="0">
      <xs:complexType>
        <xs:attribute name="number" type="xs:string"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

The syntax used to declare an empty element is actually very simple. Notice that the xs:element declaration for the previous phone element contains a complex type definition that only includes a single attribute declaration. This tells the schema processor that the phone element may only contain complex content (elements), and since no additional nested element declarations are provided, it must remain empty.



Library Navigation Links

Copyright © 2002 O'Reilly & Associates. All rights reserved.