Attributes

In this lesson of the XML Schema tutorial, you will learn...
  1. To define empty elements.
  2. To declare element attributes.
  3. To restrict attribute values.

Overview

While attributes themselves must be of simple type, only complex-type elements can contain attributes.

Empty Elements

An empty element is an element that contains no content, but it may have attributes. The HomePage element in the instance document below is an empty element. Below the instance is the snippet from the Author.xsd schema that declares the HomePage element.

Code Sample: Attributes/Demos/MarkTwain.xml

<?xml version="1.0"?>
<Author xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Author.xsd">
 <Name>
  <FirstName>Mark</FirstName>
  <LastName>Twain</LastName>
 </Name>
 <HomePage URL="http://www.marktwain.com"/>
</Author>

Code Sample: Attributes/Demos/Author.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="HomePage"> <xs:complexType> <xs:attribute name="URL" type="xs:anyURI"/> </xs:complexType> </xs:element>
---- Code Omitted ----
</xs:schema>

Adding Attributes to Elements with Complex Content

Elements that have child elements are said to contain complex content. Attributes for such elements are declared after the element's model group. For example, the Name element in the XML instance below has two child elements and two attributes. Below the instance is the snippet from the Author2.xsd schema that declares the Name element.

Code Sample: Attributes/Demos/MarkTwain2.xml

<?xml version="1.0"?>
<Author xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Author2.xsd">
 <Name Pseudonym="true" HomePage="http://www.marktwain.com">
  <FirstName>Mark</FirstName>
  <LastName>Twain</LastName>
 </Name>
</Author>

Code Sample: Attributes/Demos/Author2.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="Name"> <xs:complexType> <xs:sequence> <xs:element name="FirstName" type="xs:string"/> <xs:element name="LastName" type="xs:string"/> </xs:sequence> <xs:attribute name="Pseudonym" type="xs:boolean"/> <xs:attribute name="HomePage" type="xs:anyURI"/> </xs:complexType> </xs:element>
---- Code Omitted ----
</xs:schema>

Adding Attributes to Elements with Simple Content

An element with simple content is one that only contains character data. If such an element contains one or more attributes, then it is a complex-type element. Elements with simple content and attributes are declared using the xs:simpleContent element and then extending the element with the xs:extension element, which must specify the type of simple content contained with the base attribute. The syntax is shown below.

Syntax
<xs:element name="ElementName">
 <xs:complexType>
  <xs:simpleContent>
   <xs:extension base="xs:string">
    <xs:attribute name="AttName" type="xs:string"/>
   </xs:extension>
  </xs:simpleContent>
 </xs:complexType>
</xs:element>

For example, the FirstName element in the XML instance below contains only simple content and has a single attribute. Below the instance is the snippet from the Author3.xsd schema that declares the FirstName element.

Code Sample: Attributes/Demos/NatHawthorne.xml

<?xml version="1.0"?>
<Author xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:noNamespaceSchemaLocation="Author3.xsd">
 <Name Pseudonym="true" HomePage="http://www.nathanielhawthorne.com">
  <FirstName Full="false">Nat</FirstName>
  <LastName>Hawthorne</LastName>
 </Name>
</Author>

Code Sample: Attributes/Demos/Author3.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="FirstName"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Full" type="xs:boolean"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
---- Code Omitted ----
</xs:schema>

Restricting Attribute Values

Attribute values are restricted in the same way that the values of simple-type elements are restricted. Below are three examples.

This first example shows how to restrict an attribute value by defining its type locally. You may test Attributes/Demos/HuckFinn.xml against this schema.

Code Sample: Attributes/Demos/Book.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Book">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="Title" type="xs:string"/>
    <xs:element name="Author">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="Name" type="xs:string"/>
      </xs:sequence>
      <xs:attribute name="Title">
       <xs:simpleType>
        <xs:restriction base="xs:string">
         <xs:enumeration value="Mr."/>
         <xs:enumeration value="Ms."/>
         <xs:enumeration value="Dr."/>
        </xs:restriction>
       </xs:simpleType>
      </xs:attribute>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

This second example shows how to restrict an attribute value by applying a globally defined simple type. You may test Attributes/Demos/TomSawyer.xml against this schema.

Code Sample: Attributes/Demos/Book2.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:simpleType name="PersonTitle">
  <xs:restriction base="xs:string">
   <xs:enumeration value="Mr."/>
   <xs:enumeration value="Ms."/>
   <xs:enumeration value="Dr."/>
  </xs:restriction>
 </xs:simpleType>
 <xs:element name="Book">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="Title" type="xs:string"/>
    <xs:element name="Author">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="Name" type="xs:string"/>
      </xs:sequence>
      <xs:attribute name="Title" type="PersonTitle"/>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

This third example shows how to declare an attribute with a derived type globally. You may test Attributes/Demos/LifeOnTheMississippi.xml against this schema.

Code Sample: Attributes/Demos/Book3.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:attribute name="Title">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:enumeration value="Mr."/>
    <xs:enumeration value="Ms."/>
    <xs:enumeration value="Dr."/>
   </xs:restriction>
  </xs:simpleType>
 </xs:attribute>
 <xs:element name="Book">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="Title" type="xs:string"/>
    <xs:element name="Author">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="Name" type="xs:string"/>
      </xs:sequence>
      <xs:attribute ref="Title"/>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

Default and Fixed Values

Default Values

Attributes can have default values. To specify a default value, use the default attribute of the xs:attribute element. Default values for attributes work slightly differently than they do for elements. If the attribute is not included in the instance document, the schema processor inserts it with the default value. You may test Attributes/Demos/NatHawthorne2.xml against this schema.

Code Sample: Attributes/Demos/Author4.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="FirstName"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Full" type="xs:boolean" default="true"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
---- Code Omitted ----
</xs:schema>

Fixed Values

Attribute values can be fixed, meaning that, if they appear in the instance document, they must contain a specified value. Like with simple-type elements, this is done with the fixed attribute. You may test Attributes/Demos/NatHawthorne3.xml against this schema.

Code Sample: Attributes/Demos/Author5.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="Name"> <xs:complexType> <xs:sequence> <xs:element name="FirstName"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Full" type="xs:boolean" default="true"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="LastName" type="xs:string"/> </xs:sequence> <xs:attribute name="Pseudonym" type="xs:boolean" fixed="true"/> <xs:attribute name="HomePage" type="xs:anyURI"/> </xs:complexType> </xs:element> </xs:sequence>
---- Code Omitted ----
</xs:schema>

Requiring Attributes

By default, attributes are optional, but they can be required by setting the use attribute of xs:attribute to required as shown below.

Code Sample: Attributes/Demos/Author6.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
---- Code Omitted ----
<xs:element name="Name"> <xs:complexType> <xs:sequence> <xs:element name="FirstName"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Full" type="xs:boolean" default="true"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="LastName" type="xs:string"/> </xs:sequence> <xs:attribute name="Pseudonym" type="xs:boolean" fixed="true"/> <xs:attribute name="HomePage" type="xs:anyURI" use="required"/> </xs:complexType> </xs:element>
---- Code Omitted ----
</xs:schema>

Attributes Conclusion

In this lesson of the XML Schema tutorial, you have learned about creating attributes. You now are able to accomplish a lot with XML Schema. In the next lesson, you will learn some new methods for making your code more modular.

To continue to learn XML Schema go to the top of this page and click on the next lesson in this XML Schema Tutorial's Table of Contents.

Use of this website implies agreement to the following:

Copyright Information

All pages and graphics on this Web site are the property of Webucator, Inc. unless otherwise specified.

None of the content on this website may be redistributed or reproduced in any way, shape, or form without written permission from Webucator, Inc.

No Printing or saving of web pages

This content may not be printed or saved. It is for online use only.


Linking to this website

You may link to any of the pages on this website; however, you may not include the content in a frame or iframe without written permission from Webucator, Inc.


Warranties

This website is provided without warranty of any kind. There are no guarantees that use of the site will not be subject to interruptions. All direct or indirect risk related to use of the site is borne entirely by the user. All code and explanations provided on this site are provided without warranties to correctness, performance, fitness, merchantability, and/or any other warranty (whether expressed or implied).

For individual private use only

You agree not to use this online manual to deliver or receive training. If you are delivering or attending a class that is making use of this online manual, you are in violation of our terms of service. Please report any abuse to courseware@webucator.com. If you would like to deliver or receive training using this manual, please fill out the form at http://www.webucator.com/Contact.cfm.