SGML facilite le développement de types de documents ou de langages de marquage spécialisés. Une application SGML est un ensemble de règles pour l'utilisation d'un ou plusieurs types de documents. Elle est généralement développée après identification des besoins d'échanges formels de données dans une communauté, un secteur d'activité, ...

Une définition de type de document est composée de deux parties : une partie formelle en SGML appelée DTD, et un ensemble de conventions d'application.

DTD signifie Document Type Definition en anglais, c'est à dire Définition de Type de Document en français. Il s'agit d'un fichier définissant la syntaxe des documents, et permet donc leur validation :

  • Nom d'élément valides,
  • Attributs qu'ils peuvent avoir,
  • Valeurs possible pour les attributs,
  • Contenu possible pour les éléments.

La syntaxe des DTD est définie par la spécification du SGML. Une DTD permet la validation de documents SGML, mais aussi de documents HTML, XML et XHTML. Cependant, la DTD du HTML est normalisée, et celle d'un document XML doit respecter les restrictions et contraintes de la syntaxe XML.

Chaque DTD définit une classe de documents à laquelle sont rattachées toutes les instances similaires, sous la forme d'une grammaire donnant la liste des éléments (ou balises), des attributs, leur contenu et leur agencement, ainsi que le vocabulaire supplémentaire sous la forme d'une liste d'entités de caractère.

Exemple :

<!doctype Memo [
<!element Memo         - - (Salutation, P*, Closing?)>
<!element Salutation   O O (Date & To & Address?)>
<!element (P|Closing|To|Address) - O (#PCDATA)>
<!element Date - O EMPTY>
<!attlist Date
	numeric CDATA #REQUIRED
]>

Cet exemple contient 4 déclarations d'éléments pour un type de document nommé Memo.

La séquence décrivant le contenu des éléments est entre parenthèses. Elle est précédée de deux caractères qui spécifient respectivement si la balise d'ouverture et la balise de fermeture sont obligatoires ou optionnelles :

  • - Balise requise,
  • O Balise optionnelle.
<!element Memo         - - (Salutation, P*, Closing?)>
L'élément <Memo> contient un élément <Salutation>, aucun ou plusieurs éléments <P>, et finir éventuellement par un élément <Closing>.
<!element Salutation   O O (Date & To & Address?)>
L'élément <Salutation> contient un élément <Date>, un élément <To>, et finit éventuellement par un élément <Address>.
Les deux lettres O signifient que les balises d'ouverture et de fermetures sont optionnelles.

Cela ne signifie pas que l'élément de salutation est optionnel, car il est indiqué comme obligatoire dans la séquence de l'élément Memo. Cet élément est donc toujours présent, sans aucune balise, ce qui signifie la présence de son contenu. Les deux exemples d'instances ci-dessous sont donc valides :

<Memo>
  <Salutation>
    <Date></Date>
    <To>Lecteurs de ce wikilivre</To>
  </Salutation>
  <P>Avec les deux balises de Salutation.</P>
</Memo>
<Memo>
  <Date></Date>
  <To>Lecteurs de ce wikilivre</To>
  <P>Sans les deux balises de Salutation.</P>
</Memo>
<!element (P|Closing|To|Address) - O (#PCDATA)>
Les éléments <P>, <Closing>, <To> et <Address> contiennent du texte (#PCDATA).
<!element Date - O EMPTY>
L'élément <Date> est vide.

La notation #PCDATA indique un contenu textuel. La notation EMPTY (sans parenthèses) indique un contenu vide.