One key component of the DITA architecture gives you the ability to extend your information types and create new DTDs, without creating any new tools to support those DTDs. The mechanism which allows this is known as specialization. So how does this work? Quite simply, every DITA element contains a hint of its ancestry. Any new element is a more specific version of an existing element; it contains a pointer to that existing element, and any tool should treat it exactly as it would the existing element.
Specialization is based upon the principal of inheritance. This means that every new DTD you create inherits the properties of the ancestor DTD. This is done by giving every new element a pointer back to the "parent" element. For example, the basic DITA architecture includes a simple element known as a keyword. You may have a specific type of keyword, such as an API name, that comes up often in your documentation. Creating an element called apiname holds several advantages. Your authors can easily tell what element to use; you can more easily search for your API information by keying on that element; you can potentially do special processing on the element, such as building an index of all APIs.
In the past, any new DTD required a lot of new changes. Your editor had to know how to present the new element. Your output transforms had to know what to do with the new element. For globalization purposes, your translation tools had to know whether the new element was translatable (among other details). The translation tools often needed you to redefine the entire new DTD, even if you only added or removed one element. With DITA, none of these issues come up - everything is automatic.