**Document Type Definition (DTD)** - претставува мета-јазик со множество на декларации кои ни овозможуваат да дефинираме определен XML јазик. DTD е предвесник на XML Schema и имаат слична функција. DTD користи формална синтакса односно список на правила кои ги дефинираат **елементите** и **атрибутите**, односно укажува на тоа кои елементи се дозволени, ограничувања за дозволените елементи, редоследот на појавување на елементите ,кои атрибути може определен елемент да ги содржи и ограничувања за вредностите на елемнтите и атрибутите. DTD може да биде вклучен во самиот XML документ, или да биде поврзан со него надворешно. Document Type Declarations се јавува во синтаксички фрагмент doctypedecl уште во почетокот на XML документот.

Внатрешно дефиниран DTD
-----------------------

Ако DTD е дефиниран во внатрешноста на XML податотеката, таа треба да се дефинира со DOCTYPE,и со следнава синтакса: 

```
 <!DOCTYPE root-element [element-declarations]>
```

Пример на XML документ со внатрешен DTD:

```
 <?xml version="1.0"?>
 <!DOCTYPE note [
 <!ELEMENT note (to,from,heading,body)>
 <!ELEMENT to (#PCDATA)>
 <!ELEMENT from (#PCDATA)>
 <!ELEMENT heading (#PCDATA)>
 <!ELEMENT body (#PCDATA)>
 ]>
 <note>
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend</body>
 </note>
```

Надворешно дефиниран DTD
------------------------

Ако DTD е дефиниран како надворешен податотека,треба да се дефинира со DOCTYPE,и со следнава синтакса:

```
 <!DOCTYPE root-element SYSTEM "filename">
```

Пример на XML документ со надворешен DTD:

```
 <?xml version="1.0"?>
 <!DOCTYPE note SYSTEM "note.dtd">
 <note>
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
```

</note>

Елементи во DTD
---------------

* Елементи
* Атрибути
* Ентитети
* PCDATA
* CDATA

### Елементи во DTD

Секој таг кој се користи во рамки на еден валиден XML документ мора да биде дефиниран преку декларација на елемент во рамки на соодветниот DTD.Елементите кои се појавуваат во содржината на друг елемент уште се нарекуваат деца на елементот каде се појавуваат. Еден елемент може да биде дете на повеќе други елементи, но се декларира само еднаш.Елементите можат да содржат текст, други елементи, или да бидат празни. Општиот облик на декларација на елемент е следниот:

```
   <!ELEMENT <name> (Content Model )>
```

Постојат повеќе типови на клучни зборови и карактери кои ја дефинираат содржината на елементот, тие се:

* **EMPTY** специфицира дека дефинираниот елемент нема содржина, односно со овој симбол се дефинира празен елемент,
* **ANY** специфицира дека дефинираниот елемент има каква било содржина,
* **мешовита содржина**, што значи дека содржината може да вклучи најмалку еден текст елемент и нула или повеќе именувани елементи, но нивниот редослед и бројот на појавувања не можат да бидат ограничени, тоа може да се:

-( #PCDATA ): ова значи дека само од еден текст елемент е дозволен во содржината,
-( #PCDATA | element name | ... )\*: низа на карактери, може да се користи во било кој редослед и број на појавувања во содржината.

* **содржина на елемент**, што значи дека децата на елементот не смеат да содржат текст елементи.

### Атрибути во DTD

Елементите и нивните атрибути се декларираат одделно во DTD. Општиот облик на декларација на атрибут за определен елемент во рамки на DTD е следниот:

```
 <!ELEMENT elementName (elementContent)>
 <!ATTLIST elementName (attName attType default)+>
```

Секој атрибут, содржи:

* име на атрибутот,
* неговиот тип на податок,
* и неговата вообичаена вредност.

На пример:

```
 <!ATTLIST img
  src    CDATA          #REQUIRED
  id     ID             #IMPLIED
  sort   CDATA          #FIXED "true"
  print  (yes | no) "yes"
 >
```

Редоследот на дефинирање на атрибутите во рамки на DTD е небитен. Секој атрибут припаѓа на точно еден елемент. Доколку во рамки на DTD постојат повеќе елементи кои имаат атрибут со исто име, атрибутот мора да се дефинира за секој елемент посебно. Постојат неколку типови на атрибути:

CDATAовој тип значи дека атрибутот може да содржи каков било текст, освен карактерите.
IDсекој атрибут мора да има свое уникатно име по кое ќе се разликува од другите атрибути во истиот DTD. Погрешно е ако два - атрибути имаат ист ID. Еден елемент може да има најмногу еден атрибут од типот ID.
IDREF или IDREFSвредност која одговара на еден ID тип на атрибут и тој мора да се референцира на уникатен елемент дефиниран во DTD.
NMTOKEN или NMTOKENSвредноста на атрибутот одговара на еден ID тип, но не е ограничено да има еден единствен ID во рамките на документот.Повеќе XML имиња.
ENTITY или ENTITIESвредност која одговара на име на ентитет дефиниран во истото DTD.Поврзува интерни или надворешни податоци/документи (дефинирани преку некој ентитет во рамки на DTD) во рамки на XML документот.
NOTATION (*notation1*|...)се дефинира список на вредности одделени меѓусебно со | и атрибут може да прими само една од вредностите. Вредноста за атрибутот (default делот) може да биде само од редот на листата вредности. Вообичаената вредност може да дефинира дали атрибутот мора да го има задолжително(#REQUIRED) или подразбирливо (#IMPLIED),или пак дали да има фиксна вредност (#FIXED), а исто така која вредност треба да се користи како вообичаена врдност ("…"), во случај дадениот атрибут да е изоставен во XML тагот.
### Ентитети во DTD

Ентитетот е сличен на macro. Ентитетот доделува вредност која се задржува во текот на документот. Во употреба името треба да е попрепознатливо отколку некој број за непознати карактери. Ентитетите помагаат да се подобри читливоста на XML текстот.Тие може да се сметаат како единици наменети за складирање на делови од еден XML документ.Генерално, постојат два типа на ентитети: **внатрешни** и **надворешни**. Внатрешните ентитети ја имаат следната декларација: 

```
 <!ENTITY name "replacement text">
```

и истите служат за единствено дефинирање на текст кој често се повторува во рамки на XML документот. Со повик од облик &name; во XML документот, во рамки на истиот на местото од повикот се вметнува текстот дефиниран во декларацијата како replacement text.
Општиот облик на декларација на надворешен ентитет за податоци во XML формат е следната:

```
 <!ENTITY name SYSTEM "URI">
```

Надворешните ентитети се однесуваат на надворешното чување на објекти. Тие се декларирани со уникатно име во документот, и со јавен идентификатор (FPI) и/или систем индентификатор (кој се толкува како URI) наведувајќи каде е изворот на нивната содржина. Тие всушнотс постојат во два факти: разложени надворешни субјекти и неразложени надворешни субјекти.

Пример за внатрешен ентитет:

```
 <!DOCTYPE sgml [
   <!ELEMENT sgml ANY>
   <!ENTITY % std       "standard SGML">
   <!ENTITY % signature "— &author;.">
   <!ENTITY % question  "Why couldn’t I publish my books directly in %std;?">
   <!ENTITY % author    "William Shakespeare">
   ]>
   <sgml>&question;&signature;</sgml>
```

Забележете дека внатрешните ентитети може да се дефинираат во било кој редослед, сè додека тие не се наведени и разложени во DTD или во телото на документот.

Користена литература
--------------------

* В. Трајковиќ: *Експертни системи - скрипта*. ФЕИТ, УКИМ, Скопје, 2010.

Наводи
------

1. ↑  „doctypedecl". *Extensible Markup Language (XML) 1.1*. W3C.
2. ↑
3. ↑  „архивски примерок". Архивирано од изворникот на 2012-06-29. Посетено на 2011-12-06.

Дополнителни врски
------------------

* Definition of the XML document type declaration from Extensible Markup Language (XML) 1.0 (Fourth Edition) on W3.org
* XML DTD Quick Reference
* The XML FAQ has some DTD-specific entries
* DTD Tutorial from W3schools Архивирано на 30 декември 2004 г.
* Zvon DTD Tutorial - in 7 languages
* Interactive DTD tutorial Архивирано на 17 ноември 2011 г. from XMLzoo
* Different doctypes for HTML
* XMLPatterns.com - Design Patterns for developing DTDs
* dtd2xs Converts a DTD to an XML Schema
* PlainXML Converts a DTD to POJO objects
* DTD Statistics Архивирано на 5 октомври 2016 г.