What are attribute declarations in DTDs, and how are they used? Provide examples of different attribute types.
In a Document Type Definition (DTD), attribute declarations are used to define the attributes that can be associated with elements in an XML document. DTDs allow the structure of the XML document to be specified, including which elements can have attributes, what types of attributes they can have, and the default values for these attributes.
### Syntax of Attribute Declarations
An attribute declaration in a DTD follows this general syntax:
```
<!ATTLIST element-name attribute-name attribute-type default-value>
```
Where:
- `element-name` is the name of the XML element that will have the attribute.
- `attribute-name` is the name of the attribute being defined.
- `attribute-type` specifies the type of value the attribute can have.
- `default-value` defines what value the attribute will have if it is not explicitly specified in the XML document.
### Attribute Types
There are several predefined attribute types in DTDs:
1. **CDATA**: A character data type that allows any character content.
2. **ID**: A unique identifier for an element within the XML document.
3. **IDREF**: A reference to another ID within the document.
4. **IDREFS**: A space-separated list of ID references.
5. **ENTITY**: A reference to an entity declared in the document.
6. **ENTITIES**: A space-separated list of entity references.
7. **NMTOKEN**: A name token that cannot contain spaces.
8. **NMTOKENS**: A space-separated list of name tokens.
### Default Values
Default values can be one of the following:
- A specified value (e.g., `"default"`).
- `#REQUIRED` to indicate that an attribute must be provided.
- `#IMPLIED` to indicate that the attribute is optional.
- `#FIXED` to specify a default value that cannot be changed.
### Examples
1. **Simple attribute declaration with CDATA:**
```xml
<!ATTLIST book
title CDATA #REQUIRED
author CDATA #IMPLIED
>
```
In this example, the `<book>` element must have a `title` attribute (of type CDATA), while the `author` attribute is optional.
2. **Using ID and IDREF:**
```xml
<!ATTLIST person
id ID #REQUIRED
friend IDREF #IMPLIED
>
```
Here, each `<person>` element has a required `id` attribute (unique identifier) and an optional `friend` attribute that references another `person` by its `id`.
3. **NMTOKEN and NMTOKENS:**
```xml
<!ATTLIST class
name NMTOKEN #REQUIRED
students NMTOKENS #IMPLIED
>
```
In this case, the `<class>` element has a required `name` attribute (a single name token) and an optional `students` attribute that can contain multiple name tokens.
4. **Entity references:**
```xml
<!ATTLIST document
type ENTITY #REQUIRED
>
```
This example defines a `type` attribute for the `<document>` element, which must refer to an entity.
### Conclusion
Attribute declarations in DTDs provide a structured way to describe the nature of attributes that elements may have in an XML document. They help ensure that the data conforms to expected formats and constraints, improving data integrity and consistency.