XML - ćwiczenia 3 - modelowanie, DTD

Encje

Encja ma swoją nazwę i wartość - fragment dokumentu. Aby można użyć danej encji, trzeba ją zadeklarować w DTD (nie dotyczy to pięciu encji predefiniowanych). Procesor XML powinien traktować dokument tak jakby w miejsce referencji do encji wstawił ich wartości.

Referencja do encji ogólnej w dokumencie ma postać &nazwa_encji; i może wystąpić poza DTD, natomiast deklaracja w DTD:
<!ENTITY nazwa-encji wartość-encji>
Może być wiele deklaracji encji o tej samej nazwie, liczy się pierwsza.
Wartość encji może być podana bezpośrednio w deklaracji ujęta w znaki " lub ', wtedy encję nazywamy wewnętrzną. Można też zadeklarować encję zewnętrzną - jest to uogólnienie pliku, jakiś zasób dostępny dla procesora XML.
Do identyfikacji encji zewnętrznej służy identyfikator systemowy lub identyfikator publiczny. Domyślnie encja po wstawieniu jest przetwarzana jako XML, powinna być fragmentem XML dającym się sparsować (jeśli jest znacznik otwierający, powinien być zamykający itp.), ponadto może zaczynać się od deklaracji analogicznej do deklaracji XML, podającej wersję XML i kodowanie (np. <?xml version="1.0" encoding="UTF-8"?>).
Jeśli chcemy zadeklarować encję nieprzetwarzaną, należy napisać NDATA notacja - notacja powinna być zadeklarowana w DTD. Encja nieprzetwarzana może w dokumencie występować tylko jako wartość atrybutu typu ENTITY (ENTITIES).

<!ENTITY wewnetrzna
         "bla bla bla <bla>123</bla>">
<!ENTITY zewnetrzna_id_systemowy
         SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY zewnetrzna_id_publiczny
         PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
         "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY zewnetrzna_nieprzetwarzana
         SYSTEM "../grafix/OpenHatch.gif"
         NDATA gif >

Encje parametryczne to specjalny rodzaj encji, do których referencje pojawiać się mogą wewnątrz DTD. Referencja ma postać: %nazwa_encji;, natomiast deklaracja:
<!ENTITY % nazwa-encji wartość-encji>
Encje parametryczne też mogą być wewnętrzne i zewnętrzne, ale nie ma nieprzetwarzanych. Encje parametryczna i ogólna o tej samej nazwie są różnymi obiektami, mogą istnieć obok siebie.
Wszystkie encje muszą być zadeklarowane przed jakimkolwiek odwołaniem do nich.

Notacje

Deklaracja notacji w DTD: <!NOTATION nazwa-notacji ID>

<!NOTATION GIF SYSTEM "ACDSee.exe">
<!NOTATION GIF PUBLIC "-//GIF.COM//Gif//EN" "ACDSee.exe">
<!NOTATION GIF PUBLIC "-//GIF.COM//Gif//EN">

Zastosowanie notacji:

Sekcje warunkowe

<![INCLUDE[ fragment DTD ]]>
<![IGNORE[ fragment DTD ]]>
W połączeniu z encjami parametrycznymi stanowią mechanizm do tworzenia sparametryzowanych DTD.

Zadania

  1. Zapisz fragment DTD opisujący znane z HTML elementy dla list ol, ul, li. Załóżmy, że body może zawierać tekst z zanurzonymi w nim listami, listy tylko elementy wypunktowania (li), a elementy wypunktowania znowu tekst z zanurzonymi listami. W każdym miejscu gdzie dopuszczalny jest tekst, może być on znakowany elementami font z atrybutami size i face.
  2. Zmień napisane wcześniej DTD tak, aby dokumenty napisane do poprzedniej wersji dalej się walidowały, natomiast nowe z pewną drobną dodatkową informacją były zgodne z nowy standardem, w którym nie ma elementów font, a są span z atrybutem style.