---
marp: true
theme: default
paginate: true
size: 16:9
style: |
section {
font-size: 24px;
}
section h1 {
color: #1a5276;
}
section h2 {
color: #2980b9;
}
section table {
font-size: 20px;
}
section small {
font-size: 18px;
}
---
# Wykład 4
## DTD — definiowanie typów dokumentów
**Systemy Zarządzania Treścią**
Politechnika Poznańska
---
# Część 1
## Wprowadzenie do DTD
---
## Czym jest DTD?
> **DTD (Document Type Definition)** to klasyczny mechanizm definiowania struktury dokumentu XML, wywodzący się bezpośrednio z języka **SGML**.
### Rola DTD
DTD określa **gramatykę dokumentu**:
- jakie elementy mogą wystąpić,
- w jakiej kolejności i liczbie,
- jakie atrybuty są dozwolone,
- jakie są typy wartości atrybutów.
### Umiejscowienie DTD
| Umiejscowienie | Opis |
|---|---|
| **Wewnętrzne (internal subset)** | DTD zapisane bezpośrednio w dokumencie XML |
| **Zewnętrzne (external subset)** | DTD w osobnym pliku, dołączane przez odwołanie |
---
## DTD wewnętrzne i zewnętrzne
### DTD wewnętrzne (w dokumencie)
```xml
]>
Ważne
Treść notatki
```
### DTD zewnętrzne (osobny plik)
**Plik `notatka.dtd`:**
```
```
**Dokument XML:**
```xml
Ważne
Treść notatki
```
> Zewnętrzne DTD jest **wielokrotnie używane** przez wiele dokumentów — to standardowy sposób organizacji.
---
## DTD — prosty przykład
```xml
]>
```
### Cztery konstrukcje DTD
| Konstrukcja | Przeznaczenie |
|---|---|
| `` | Definicja elementu i jego zawartości |
| `` | Definicja atrybutów elementu |
| `` | Definicja encji (skrótów, zasobów) |
| `` | Opis formatów nieparsowalnych (np. obrazów) |
### Analiza przykładu
- `wiersz` zawiera: `autor` (raz), `tytul` (opcjonalnie), `zwrotka` (dowolnie wiele),
- `wiersz` ma atrybut `bialy` typu wyliczeniowego `(tak|nie)` z domyślną wartością `"nie"`,
- `autor`, `tytul`, `wers` zawierają tylko tekst (`#PCDATA`),
- `zwrotka` zawiera dowolną liczbę elementów `wers`.
---
# Część 2
## Deklaracja elementu — ``
---
## Notacja modelu zawartości
Model zawartości elementu opisuje się przy użyciu **wyrażeń regularnych**, które określają, jakie elementy potomne — w jakiej kolejności i liczbie — mogą wystąpić.

### Operatory liczebności (krotności)
| Operator | Znaczenie | Przykład | Interpretacja |
|---|---|---|---|
| *(brak)* | dokładnie raz | `(autor)` | element `autor` wystąpi dokładnie 1 raz |
| `?` | zero lub raz | `(tytul?)` | element `tytul` może nie wystąpić lub wystąpić 1 raz |
| `*` | zero lub więcej | `(zwrotka*)` | element `zwrotka` dowolną liczbę razy (także 0) |
| `+` | jeden lub więcej | `(wers+)` | element `wers` co najmniej 1 raz |
### Operatory łączenia
| Operator | Znaczenie | Przykład |
|---|---|---|
| `,` | sekwencja (w podanej kolejności) | `(autor, tytul)` — najpierw autor, potem tytuł |
| `\|` | alternatywa (wybór jednego) | `(pies\|kot)` — albo pies, albo kot |
| `( )` | grupowanie | `(a, (b\|c))` — a, a następnie b lub c |
> Zapis `(autor, tytul?, zwrotka*)` oznacza: **autor** (raz), potem **tytul** (opcjonalnie), potem **zwrotka** (dowolnie wiele).
---
## Deklaracja elementu — składnia ogólna
```
```
### Rodzaje modelu zawartości
| Rodzaj | Składnia | Znaczenie | Przykład |
|---|---|---|---|
| **Pusty** | `EMPTY` | element nie może mieć treści | `` |
| **Dowolny** | `ANY` | dowolna treść (rzadko stosowane) | `` |
| **Tekstowy** | `(#PCDATA)` | tylko tekst parsowalny | `` |
| **Elementowy** | `(potomkowie)` | tylko elementy potomne | `` |
| **Mieszany** | `(#PCDATA\|a\|b)*` | tekst przeplatany elementami | `` |
### Słowo kluczowe `#PCDATA`
**PCDATA** (*Parsed Character Data*) oznacza tekst, który parser **przetwarza** (w przeciwieństwie do CDATA, która nie jest przetwarzana). Tekst w elemencie `(#PCDATA)` może zawierać encje i odwołania.
---
## Przykłady deklaracji ELEMENT
### Kompletna gramatyka książki
```
```
### Interpretacja
| Deklaracja | Znaczenie |
|---|---|
| `ksiazka (tytul, autor+, wydawca?, cena?)` | tytuł (raz), autorzy (≥1), wydawca (opcj.), cena (opcj.) — w tej kolejności |
| `tytul (#PCDATA)` | tylko tekst |
| `autor (#PCDATA)` | tylko tekst |
| `lista-pusta EMPTY` | brak jakiejkolwiek treści |
### Zagnieżdżone modele
```
```
> Modele zawartości można dowolnie **zagnieżdżać**, tworząc hierarchie o dowolnej głębokości.
---
# Część 3
## Deklaracja atrybutów — ``
---
## Deklaracja atrybutów — składnia
Deklaracja `` definiuje atrybuty danego elementu: nazwy, typy wartości i wartości domyślne.
```
```
### Struktura pojedynczej deklaracji
| Składnik | Opis |
|---|---|
| `nazwa-elementu` | Element, do którego atrybut należy |
| `nazwa-atrybutu` | Nazwa atrybutu |
| `typ-wartości` | Typ dopuszczalnych wartości (CDATA, ID, IDREF, ...) |
| `deklaracja-domyślności` | Czy atrybut wymagany, opcjonalny, domyślny czy ustalony |
---
## Typy wartości atrybutów
| Typ | Opis | Przykład |
|---|---|---|
| **CDATA** | dowolny tekst (najczęstszy) | `autor CDATA` |
| **ID** | unikatowy identyfikator — nie może się powtarzać w dokumencie | `id ID #REQUIRED` |
| **IDREF** | odwołanie do istniejącego ID innego elementu | `ref IDREF #IMPLIED` |
| **IDREFS** | lista odwołań do ID (rozdzielone spacjami) | `refs IDREFS #IMPLIED` |
| **NMTOKEN** | pojedynczy token (bez spacji) | `kod NMTOKEN` |
| **NMTOKENS** | lista tokenów rozdzielonych spacjami | `slowa NMTOKENS` |
| **ENTITY** | nazwa zadeklarowanej encji | `grafika ENTITY` |
| **ENTITIES** | lista nazw encji | `grafiki ENTITIES` |
| **NOTATION** | nazwa zadeklarowanej notacji | `format NOTATION` |
| **wyliczenie** | jedna z podanych wartości (w nawiasach, rozdzielone `\|`) | `bialy (tak\|nie) "nie"` |
---
## Typy ID i IDREF — mechanizm odwołań
Typy `ID`, `IDREF` i `IDREFS` tworzą **mechanizm wewnętrznych odwołań** w dokumencie:
```xml
]>
Jan Kowalski
Anna Nowak
Piotr Wiśniewski
```
### Zasady
- **ID** — wartość unikatowa w całym dokumencie (jak klucz),
- **IDREF** — wskazuje na istniejący ID (jak klucz obcy),
- **IDREFS** — lista odwołań rozdzielonych spacjami.
> Mechanizm ID/IDREF to prosty odpowiednik **relacji klucz obcy → klucz główny** znany z baz danych.
---
## Deklaracje domyślności atrybutów
| Deklaracja | Znaczenie | Przykład |
|---|---|---|
| `#REQUIRED` | atrybut **wymagany** — musi wystąpić | `id ID #REQUIRED` |
| `#IMPLIED` | atrybut **opcjonalny** — może nie wystąpić | `notatka CDATA #IMPLIED` |
| `#FIXED "wartość"` | atrybut ma **ustaloną**, niezmienną wartość | `wersja CDATA #FIXED "1.0"` |
| `"wartość"` | **domyślna** wartość, gdy atrybut pominięty | `plec (K\|M) "K"` |
### Różnica `#FIXED` vs domyślna
- **Domyślna** (`"wartość"`): jeśli atrybut pominięty, parser **dodaje** go z tą wartością; jeśli podany — może mieć inną wartość,
- **#FIXED**: atrybut musi mieć **dokładnie tę wartość** (jeśli wystąpi z inną — błąd).
---
## Przykład pełnej deklaracji ATTLIST
```xml
```
### Wyjaśnienie
| Atrybut | Typ | Domyślność | Znaczenie |
|---|---|---|---|
| `id` | ID | #REQUIRED | unikatowy identyfikator, obowiązkowy |
| `pesel` | CDATA | #REQUIRED | tekst, obowiązkowy |
| `plec` | wyliczenie | `"K"` | tylko K lub M, domyślnie K |
| `notatka` | CDATA | #IMPLIED | tekst, opcjonalny |
| `wersja` | CDATA | #FIXED "1.0" | zawsze "1.0" |
| `przełożony` | IDREF | #IMPLIED | odwołanie do ID innego elementu |
---
# Część 4
## Encje i notacje
---
## Deklaracja encji — ``
Encje pozwalają definiować **skróty, symbole i zasoby zewnętrzne**. Dzielą się na wewnętrzne i zewnętrzne.
### Encje wewnętrzne (definiowane w DTD)
```xml
```
Użycie w dokumencie: `&firma;` zostanie zastąpione tekstem `Politechnika Poznańska`.
### Encje zewnętrzne (odwołanie do pliku)
```xml
```
Użycie `&rozdzial1;` wstawi zawartość pliku `rozdzial1.xml`.
> Encje działają jak **makrodefinicje** — definiujesz raz, używasz wielokrotnie.
---
## Encje parametryczne
Encje parametryczne (z `%`) używane są **wyłącznie wewnątrz DTD** do wielokrotnego wykorzystania fragmentów deklaracji:
```xml
```
### Zastosowanie
- Deklaracja `wspolne-atrybuty` definiowana **raz**,
- Używana w wielu deklaracjach `ATTLIST` przez `%wspolne-atrybuty;`.
> Encje parametryczne to mechanizm **wielokrotnego użycia** fragmentów DTD — analog grupy atrybutów z XML Schema.
---
## Deklaracja notacji — ``
Notacja opisuje format danych **nieparsowalnych** (obrazy, dźwięk, wideo) i wiąże go z aplikacją zewnętrzną.
### Deklaracja notacji
```xml
```
### Użycie notacji w atrybucie
```xml
```
### Powiązanie encji z notacją
```xml
```
> Notacje opisują **zewnętrzne formaty binarne**, których parser XML nie potrafi (i nie musi) interpretować.
---
# Część 5
## Ograniczenia DTD
---
## Dlaczego DTD nie wystarcza?
Zastosowania XML w integracji aplikacji wymagają **precyzyjnej kontroli struktur danych**. Przeniesienie sprawdzania poprawności z aplikacji na narzędzie walidujące daje spore oszczędności — szacuje się, że **~60% tworzonego kodu dotyczy weryfikacji poprawności danych** (Roger L. Costello, *XML Schema Tutorial*).
### Ograniczenia DTD
| Ograniczenie | Opis |
|---|---|
| **Brak kontroli tekstu** | Niemal brak kontroli nad tekstową zawartością elementów i wartościami atrybutów |
| **Ogólne metody częstości** | Bardzo ogólne metody definiowania liczby wystąpień |
| **Mało obiektowe** | Nierozszerzalne modele struktury |
| **Składnia nie-XML** | DTD ma własną, specyficzną składnię |
| **Brak typów danych** | Nie można określić, że wartość jest liczbą, datą czy pasuje do wzorca |
| **Brak przestrzeni nazw** | DTD nie wspiera namespace'ów |
> DTD nie pozwala np. powiedzieć: "wartość atrybutu musi być liczbą całkowitą z zakresu 1–49" ani "element musi pasować do wzorca `\d{3}-\d{3}-\d{2}-\d{2}`".
---
## DTD vs XML Schema
| Cecha | DTD | XML Schema |
|---|---|---|
| **Pochodzenie** | Wywodzi się z SGML-a | Zaprojektowany na potrzeby XML-a |
| **Składnia** | Specyficzna (nie-XML) | Składnia XML |
| **Typy danych** | 10 typów | 44 wbudowane typy proste + własne |
| **Model zawartości** | Typowy mieszany | Możliwość definiowania własnych typów |
| **Kontrola tekstu** | Brak kontroli tekstowej | Zaawansowana kontrola (pattern, ranges) |
| **Przestrzenie nazw** | Brak wsparcia | Pełne wsparcie |
| **Rozszerzalność** | Nierozszerzalne | Dziedziczenie, rozszerzanie typów |
> XML Schema zachowuje pełną składnię XML, co pozwala przetwarzać schematy tymi samymi narzędziami co dokumenty — to jej fundamentalna przewaga. XML Schema jest szczegółowo omówiona w **wykładach 5–7**.
---
## Podsumowanie
| Temat | Kluczowe wnioski |
|---|---|
| **DTD** | Klasyczny mechanizm definiowania struktury dokumentu |
| **Umiejscowienie** | Wewnętrzne (w dokumencie) lub zewnętrzne (osobny plik) |
| **``** | Definiuje element i model zawartości (EMPTY, ANY, #PCDATA, potomkowie) |
| **Notacja modelu** | `,` sekwencja, `\|` alternatywa, `?` `*` `+` krotności |
| **``** | Atrybuty: typy (CDATA, ID, IDREF, ...) i domyślność |
| **ID/IDREF** | Mechanizm odwołań wewnętrznych (klucz → klucz obcy) |
| **``** | Encje wewnętrzne, zewnętrzne i parametryczne |
| **``** | Opis formatów nieparsowalnych |
| **Ograniczenia** | Brak typów danych, namespace'ów i rozszerzalności |
---
# Dziękuję za uwagę
**Systemy Zarządzania Treścią**
Politechnika Poznańska