Всички DTD написани на SGML имат някои общи черти. Това не е изненадващо, следвайки философията на SGML. Едно от най-очевидните проявявания е content и elements.
Документацията (дали една уеб страница, или книга) се състои от съдържание (content). Това съдържание се дели и подразделя на елементи. Маркирането е за да се дадат имена и да се определят границите на тези елементи за по-нататъшна обработка.
Например да разгледаме една книга. На най-горно ниво самата книга е елемент. Този елемент ``книга (book)'' очевидно съдържа глави, които също могат да бъдат разглеждани като елементи. Всяка глава съдържа други елементи като параграфи, цитати и бележки под черта. Всеки параграф може да съдържа други елементи описващи съдържание, като говор, име на герои в някаква история.
Може да разглеждате това като ``разбиване'' на съдържанието. На най-високото ниво имате едно парче, книгата. То се състои от други части, отделните глави. Те се състоят от параграфи, цитати имена и т.н.
Забележете, че можете да разделите отделните елементи от съдържанието без да прибягвате до SGML термини. Наистина е много лесно да се досетите. Бихте могли дори да оцветите с различен цвят отделните части на книгата, за да ги означите.
Разбира се ние нямаме електронен молив, така че имаме нужда от друг начин да означим кои елементи на коя част от съдържанието отговарят. В езиците написани на SGML (HTML, DocBook и т.н.) това става с помощта на tags (маркери, етикети).
Mаркер (tag) се използва, за да се означи къде започва определен елемент и къде свършва. Маркера не е част от елемента . Тъй като всеки DTD е написан за маркиране на определен тип информация, то той ще разпознава различни елементи и поради това ще има различни имена за маркери.
За елемент с име име-на-елемента началният маркер обикновено изглежда така <име-на-елемента >. Съответстващият затварящ маркер ще бъде </име-на-елемента >.
Example 3-1. Използване на елемент (начален и краен маркери)
HTML има елемент означаващ, че съдържанието между маркерите е параграф. Елемента се нарича p. Този елемент има начален и краен маркери.
<p>Това е параграф. Започва с начален маркер
за 'p' елемент и свършва с краен маркер за 'p' елемент.</p>
<p>Това е друг параграф. Този е по-кратък.</p>
Не всички елементи изискват краен маркер. Някои нямат съдържане. Например в HTML можете да укажете, че искате в документа да се появи хоризонтална линия. Очевидно линията няма съдържание, така че началният маркер е достатъчен.
Example 3-2. Използване на елемент (само с начален маркер)
HTML има елемент за описване на хоризонтална линия, наречен hr. Този елемент не опакова съдържание, така че има само начален маркер.
<p>Това е параграф.</p>
<hr>
<p>Това е друг параграф. Хоризонтална линиÿ разделÿ този от предишниÿ
параграф.</p>
От казаното до сега не става ясно дали елемент може да съдържа друг елемент. В примера за книгата, елемента книга съдържаше всички глави, които от своя страна съдържаха всички параграфи и т.н.
Example 3-3. Елементи в елементи; <em>
<p>Това е пример <em>paragraph</em>, където
нÿкои от <em>думите</em> са <em>подчертани</em>.</p>
DTD специфицира правилата описващи кои елементи могат да съдържат в себе си други елементи и какво точно могат да съдържат.
Important: Хората често бъркат маркер и елемент, и използват термините, като че ли са взаимозаменяеми. Те не са.
Елемента е концептуална част от документ. Елемента има дефинирани начало и край. Маркерите просто отбелязват къде почва и къде свършва елемент.
Когато в този документ (или друг споменаващ SGML) се говори за ``<p> маркер'' се има в предвид текста състоящ се от трите символа <, p и >. Но фразата `` <p> '' означава целият елемент.
Разликата е много тънка, но я имайте в предвид.
Елементите могат да имат атрибути. Атрибут може да има име и стойност и служи за добавяне на допълнителна информация към елемент. Това може да бъде информация показваща как трябва да бъде показан елемента, или да идентифицира уникално това появяване на елемента или нещо друго.
Атрибутите на елемент може да са написани вътре в началния маркер за елемента под формата на име-на-атрибут="стойност-на-атрибут".
В сравнително нова версия на HTML, <p> елемента има атрибут наречен align, които предизвиква подравняване на параграф от програмата показваща HTML.
Атрибута align може да приема една от четири предварително дефинирани стойности, left, center, right и justify. Ако атрибута не е дефиниран, подразбиращата се стойност е left.
Example 3-4. Използване на елемент с атрибут
<p align="left">Включването на align атрибута в този параграф е безсмислено, тъй като по подразбиране подравнÿването е лÿво.</p> <p align="center">Това ще се поÿви в центъра.</p>
Някои атрибути могат да заемат само определени стойности, като left или justify. Други позволяват да въведете каквото искате. Ако е необходимо да включите кавички (") вътре в атрибут, това става с единична кавичка около стойността.
Понякога не е необходимо да използвате кавички около стойностите. Все пак, правилата за това са много точни и е доста по-приемливо просто винаги да слагате кавички на стойностите на атрибутите.
Информацията за атрибутите, елементите и маркерите е записана в SGML каталози. Различните инструменти на Проекта по Документация използват тези файлове, за да валидизират това което сте направили. Инструментите в textproc/docproj включват различни файлове, включително различни SGML каталожни файлове. Проекта по Документация за FreeBSD включва свои собствени набори от каталози. Необходимо е инструментите да знаят за наличието на тези каталожни файлове.
За да можете да изпълните примерите в този документ трябва да инсталирате няколко програми и да се уверите, че променлива на обкръжението е инициализирана коректно.
Изтеглете и инсталирайте textproc/docproj от системата от портове на FreeBSD. Това е meta-port, който трябва да изтегли и инсталира всички програми и файлове, които са необходими за работата с Документацията.
Добавете линии към стартиращите файлове на вашата обвивка (шел) за да инициализират SGML_CATALOG_FILES. Ако не работите с английската версия на документацията, ще трябва да сложите коректната директория за език.
Example 3-6. .profile, за sh(1) и bash(1) потребители
SGML_ROOT=/usr/local/share/sgml
SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog
SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
SGML_CATALOG_FILES=${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
SGML_CATALOG_FILES=/usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
SGML_CATALOG_FILES=/usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
export SGML_CATALOG_FILES
Example 3-7. .login, за csh(1) и tcsh(1) потребители
setenv SGML_ROOT /usr/local/share/sgml
setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog
setenv SGML_CATALOG_FILES ${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
setenv SGML_CATALOG_FILES ${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
setenv SGML_CATALOG_FILES /usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
setenv SGML_CATALOG_FILES /usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
След това, или излезте и влезте отново в системата или просто стартирайте командите от командната линия, за да инициализирате променливите с необходимите стойности.
Създайте example.sgml и въведете следния текст;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>An example HTML file</title>
</head>
<body>
<p>This is a paragraph containing some text.</p>
<p>This paragraph contains some more text.</p>
<p align="right">This paragraph might be right-justified.</p>
</body>
</html>
Опитайте да валидизирате този файл със SGML парсер.
Част от textproc/docproj е nsgmls(1) валидизиращ парсер. Обикновенно, nsgmls(1) прочита документ маркиран като SGML DTD и връща копие от Element Structure Information Set (ESIS, но това не е важно за момента).
Все пак, ако на nsgmls(1) се даде -s параметър, nsgmls(1) ще потисне нормалния си резултат и ще отпечата само съобщенията за грешки. Това е добър начин да проверите дали документа е валиден или не.
Използване на nsgmls(1) за проверка дали документ е валиден;
% nsgmls -s example.sgml
Както виждате, nsgmls(1) не връща никакъв резултат. Това означава, че документа е валидизиран успешно.
Да видим какво ще се случи когато някой от елементите е изпуснат. Опитайте да изтриете <title> и </title> маркерите, стартирайте пак валидизирането.
% nsgmls -s example.sgml nsgmls:example.sgml:5:4:E: character data is not allowed here nsgmls:example.sgml:6:8:E: end tag for "HEAD" which is not finished
Резултата за грешки от nsgmls(1) е организиран в групи разделени с двоеточие, или колони.
| Колона | Значение |
|---|---|
| 1 | Името на програмата генерирала грешката. Това винаги ще е nsgmls. |
| 2 | Името на файла съдържащ грешката. |
| 3 | Номер на реда с грешка. |
| 4 | Номера на колоната съдържаща грешката. |
| 5 | Еднобуквен код показващ естеството на грешката I означава информация, W е за предупреждения, E означава грешка[a] а X е за cross-references. Тези съобщения са грешки. |
| 6 | Текст на съобщението за грешка. |
| Notes: a. не винаги е петата колона. nsgmls -sv показва nsgmls:I: SP version "1.3" (в зависимост от инсталираната версия). Както виждате това е информационно съобщение. |
|
Изпускането на <title> маркера генерира 2 различни грешки.
Първата грешка показва, че съдържанието (в този случай символи, вместо начало на елемент) не е това което SGML парсера очаква. Парсера очаква да намери начален маркер за елементи, които са валидни вътре в <head> (като <title>).
Втората грешка е заради това, че <head> елементите трябва да съдържат <title> елемент. Поради това nsgmls(1) смята, че елемент не е правилно завършен. Все пак, затварящият маркер показва, че елемента е бил затворен преди да е завършен.
Сложете title елемента обратно.
Този и други документи можете да намерите в ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
За въпроси отностно FreeBSD, прочетете
документацията
преди да попитате в <questions@FreeBSD.org>.
За въпроси отностно този документ, e-mail <doc@FreeBSD.org>.