In a Document Type Definition (DTD) an attributes type can be set to be ID.
For a value to be a valid ID the following must be true:-
- It must conform to the EBNF for "Name". In simple terms this means a "Name" has to start with a letter or ':' or '_'. The rest of the characters must be numbers, letters ':', '_', '-', or '.' it can not contain any spaces.
- It must be unique across all the ID values declared within the XML Document.
- An element may only have a single ID value declared against it.
- An attribute declared of type ID must be defined as either #IMPLIED or #REQUIRED.
 NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
 Name ::= NameStartChar (NameChar)*
|Declaring an IDREF Attribute in a DTD||Copy Code|
<!ELEMENT artist EMPTY> <!ATTLIST artist name CDATA #REQUIRED> <!ATTLIST artist artistID ID #REQUIRED> <!ELEMENT album EMPTY> <!ATTLIST album name CDATA #REQUIRED> <!ATTLIST album albumArtistID IDREF #IMPLIED> <!ATTLIST album contributingArtistIDs IDREFS #IMPLIED>
|Sample XML||Copy Code|
<artist name="Nick Cave" artistID="NC"/> <artist name="Kylie Minogue" artistID="KM"/> <artist name="PJ Harvey" artistID="PJH"/> <artist name="Shane MacGowan" artistID="SM"/> <album name="Murder Ballads" albumArtistID="NC" contributingArtistIDs="KM PJH SM"/>
When an XML document is read in conjunction with a DTD, the ID value has the standard attribute whitespace normalization rules are applied plus an additional level of normalization.
Before the value of an attribute is passed to the application or checked for validity, the XML processor MUST normalize the attribute value by applying the algorithm below, or by using some other method such that the value passed to the application is the same as that produced by the algorithm.
- All line breaks MUST have been normalized on input to #xA as described in 2.11 End-of-Line Handling, so the rest of this algorithm operates on text normalized in this way.
- Begin with a normalized value consisting of the empty string.
- For each character, entity reference, or character reference in the unnormalized attribute value, beginning with the first and continuing to the last, do the following:
- For a character reference, append the referenced character to the normalized value.
- For an entity reference, recursively apply step 3 of this algorithm to the replacement text of the entity.
- For a white space character (#x20, #xD, #xA, #x9), append a space character (#x20) to the normalized value.
- For another character, append the character to the normalized value.
If the attribute type is not CDATA, then the XML processor MUST further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by a single space (#x20) character.