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.