Piata informatică actuală este o lume a concurentei acerbe, în care impunerea unui nou standard s-a făcut deseori prin fortă. În acest context general, păstrarea unui segment de piată cîstigat cu mai multă sau mai putină trudă s-a făcut - nu o dată - pe baza creării unor incompatibilităti voite cu produsele firmelor concurente. Evident, în această conjunctură, marele perdant este tocmai clientul „nostru", care demult nu mai este „stăpînul nostru". Un excelent exemplu în acest sens îl constituie piata editoarelor de texte, unde fiecare mare producator vine cu propriul format de reprezentare a informatiei. Pornind de la această realitate, International Organization for Standardization (ISO) a lansat la sfîrsitul lui 1986 un standard de reprezentare a documentelor numit Standard Generalized Markup Language (sau, pe scurt, SGML [1]).
Ideea de baza a SGML-ului a fost aceea că orice document are trei caracteristici fundamentale: structura, continutul si forma. Să luăm, spre exemplu, articolul de fată. Structura sa e definită de titlu, „abstract" (scurtă prezentare a continutului), cele cîteva sectiuni si bibliografie. Fiecare dintre aceste elemente structurale are cîte un continut, adică un text reprezentînd informatia stocată în cadrul respectivului element structural. În fine, forma documentului este dată de modul în care un editor sau altul îl va vizualiza pe ecran (font, culori, număr de coloane, etc). După cum se vede, structura si continutul sînt independente de utilitarul folosit, pe cînd forma este în totalitate dependentă de acesta din urmă. În concluzie, una dintre cele mai simple solutii de realizare a portabilitătii documentelor ar fi aceea de a găsi un format general de reprezentare a structurii si continutului, urmînd ca forma de vizualizare să rămînă în sarcina editorului folosit.
Odată stabilită importanta separării formei de structură si continut, ne rămîne să analizăm relatia dintre acesti doi parametri din urmă. În varianta neseparării structurii de continut, utilitarul care citeste documentul trebuie să posede cîte o rutină de interpretare pentru fiecare structură de document în parte. În cazul unui număr ridicat de tipuri de documente, fiecare avînd propria-i structură, acest lucru devine anevoios si - probabil - deloc elegant. O solutie mult mai atrăgătoare ar fi aceea de a defini un document prin două fisiere: unul care descrie structura documentului si unul care păstrează continutul său. În acest mod, utilitarul nu ar mai avea nevoie decît de un unic interpretor, care să citească „gramatica" din fisierul de informatii structurale si apoi să analizeze fisierul-continut în functie de această gramatică. Ideea de mai sus stă la baza standardului SGML, iar în continuare vom studia modul în care o astfel de arhitectură poate fi realizată si utilizată.
Termenul de „markup" (sau „marcaj") desemnează procedeul de inserare în cadrul unui document a unui string sau semn avînd o semnificatie deosebită. Începînd cu semnele specifice tehnoredactării (scrise „de mînă" pe un manuscris) si terminînd cu string-urile de tipul „<$marker1>" pe care le întîlnim în cadrul documentelor create cu procesorul de texte FrameMaker, toate aceste „marcaje" reprezintă o modalitate de „a atrage atentia" cuiva (tipograf, calculator, etc) că secventa de text ce urmează are un set de proprietăti specifice. SGML-ul utilizează „marcaj"-ul pentru a delimita secvente din continutul documentului si pentru a preciza caracteristicile structurale ale respectivelor secvente.
Înainte de a analiza un prim exemplu de document SGML, trebuie să facem cîteva precizări. După cum spuneam, un document SGML este descris cu ajutorul a două fisiere: unul specificînd structura documentului (si avînd extensia „dtd" - „Document Type Definition") si un altul reprezentînd continutul documentului (si avînd extensia „sgm"). În fisierul „dtd" sînt descrise „marcajele" folosite în fisierul „sgm" si modul în care respectivele marcaje pot fi înlăntuite/combinate în cadrul documentului. Practic, cu ajutorul „marcajelor", un document poate fi descris sub formă arborescentă, nodul rădăcină reprezentînd întregul document, iar descendentii săi desemnînd componentele „grosiere" ale documentului. Fiecare componentă poate avea la rîndu-i un număr de sub-componente, granularitatea scăzînd recursiv pînă la nivelul frunzelor, care constituie elementele atomice ale documentului.
Spre exemplu, să considerăm un document de tipul „persoana" care are doar
două componente: „nume" si „prenume". Pentru descrierea unui astfel de
document vom utiliza fisierele „persoana1.sgm" si „persoana1.dtd". Prima linie a fisierului „sgm" indică
faptul că documentul este de tip „persoana" si că descrierea structurală a unui
astfel de document se află în fisierul „persona1.dtd". La o privire atentă
asupra fisierului „persoana1.sgm" observăm că în cadrul acestuia sînt utilizate
în mod frecvent caracterele „<" si „>". Rolul caracterelor în cauză
constă în delimitarea începutului („<") si sfîrsitului („>")
fiecărui marcaj. Dacă analizăm în paralel ambele fisiere, este usor de observat că
elemente structurale din fisierul „dtd" (persoana, prenume, nume) reapar în
fisierul „sgm" încadrate între cele două caractere „<" si
„>". Fiecare dintre aceste elemente structurale apare de doua ori: odată
prefixat de caracterul „/" si o dată fără prefixul în cauză. Dacă mai
precizam că stringul „
Să analizam acum fisierul „persona1.dtd". Începem prin a vă reaminti că
acest fisier descrie „marcajele" specifice documentului si modul în care acestea
pot fi înlăntuite pentru a forma un document corect. Astfel, prima linia defineste
elementul „persoana" ca avînd două componente: „nume" si „prenume".
Cele două caractere „-" specifică faptul că atît marcajul
„
Două dintre cele mai importante marcaje întîlnite în cadrul unui fisier DTD sînt acelea care definesc elementele si atributele. În exemplul precedent „persoana", „nume" si „prenume" sînt prefixate de marcajul „
În unele cazuri poate fi dificil de decis dacă o caracteristică trebuie descrisă de către un element sau de către un atribut. Spre exemplu, să reanalizăm cazul documentului „persoana". Este oare necesar ca numele si prenumele să fie elemente? Nu am putea oare să descriem aceste caracteristici ca fiind atribute ale unei persoane? Răspunsul la aceste întrebări este cum nu se poate mai simplu: ambele caracterizări ale numelui si prenumelui sînt corecte, decizia rămînînd să fie luată în functie de preferintele celui care proiectează structura documentului.
Desi nu există o regulă în functie de care să se decidă dacă o anume componentă „trebuie să fie" element sau atribut, se poate face următoarea recomandare: dacă setul de valori pe care le poate lua componenta în cauză este finit si numărul acestor valori este restrîns, este indicată utilizarea unui atribut. În restul cazurilor este de preferat descrierea cu ajutorul elementelor. În cazul documentului „persoana", este clar că definirea numelui si a prenumelui ca si elemente este cum nu se poate mai potrivită. În aceeasi situatie ar fi si alte caracteristici, precum înăltimea, greutatea, adresa sau numărul de pasaport. În schimb sexul, starea civilă sau culoarea ochilor se pretează mai degrabă unei descrieri pe bază de atribute. Dacă adăugăm aceste informatii în cadrul documentului „persoana", obtinem fiserele „persoana2.sgm" si „persoana2.dtd".
Analizînd fisierul „persoana2.dtd", remarcăm faptul că definirea unui atribut se face cu ajutorul marcajului „
Pe lîngă elemente si atribute, SGML-ul mai permite si folosirea componentelor de tip entitate. Entitătile se împart la rîndul lor în mai multe categorii: generale, de tip caracter, externe si de tip parametru. O entitate generală se foloseste drept prescurtare a unui string (similar cu „#define"-urile din limbajul C), iar cea de tip caracter e utilizată la introducerea de imagini si caractere speciale în cadrul unui document. Entitătile externe facilitează includerea documentelor unul în cadrul celuilalt, iar cele de tip parametru definesc variabile utilizabile în cadrul documentelor.
Să presupunem că dorim să realizăm un document de tip „fisa de personal" care să contină informatiile personale ale angajatului, sectia în care munceste si o rubrică de comentarii legate de activitatea prestată. Descrierea unui astfel de document este făcut în cadrul fisierelor „fisa.dtd" si „fisa.sgm". Entitătile generale „LAB1", „LAB2", ..., „LAB5" sînt definite pentru a evita tastarea repetată a numelor în cauză. De cîte ori numele unui laborator trebuie să apară în cadrul fisierului „fisa.sgm", în loc de tastarea numelui în cauză se poate folosi numele entitătii corespunzătoare, prefixat cu un caracter „&". Entitatea externă „InfoIonut" este folosită la inserarea continutului fisierului „persoana2.sgm" în cadrul lui „fisa.sgm". În cazul în care informatiile din „persoana2.sgm" trebuie să apară în mai multe documente (în fisele de personal, de sănătate si de bibliotecă), utilizarea entitătilor externe este de preferat multiplicării informatiei în diversele documente.
Cum numele diverselor laboratoare trebuie să fie accesibile în toate fisele de personal ale întreprinderii, definirea lor ca entităti generale în cadrul fisierului „fisa.dtd" este o decizie absolut corectă. Nu la fel stau însă lucrurile si în cazul entitătii externe „InfoIonut". Deoarece „persoana2.sgm" defineste o singură persoană, acest fisier trebuie inclus într-o singură fisa de personal. Cum SGML-ul permite definirea de entităti si în cadrul fisierelor „sgm", putem obtine o mai bună structurare a informatiei mutînd definitia lui „InfoIonut" din „fisa.dtd" în „fisa. sgm". Fisierul „fisa1.sgm" ilustrează tocmai modul în care o entitate poate fi definită în fisiere de tip „sgm".
SGML permite o descriere extrem de exactă a structurii fiecărei componente a unui document. Astfel, prin intermediul conectorilor se poate specifica atît numele elementelor constitutive, cît si ordinea acestora. Spre exemplu, definitia lui „persoana" din fisierul „persoana1.dtd" se face prin intermediul listei „(prenume, nume)". Conectorul virgulă specifică faptul că o persoană este corect descrisă doar dacă i s-a specificat atît prenumele, cît si numele. În plus, prenumele trebuie să fie primul care apare în cadrul descrierii persoanei. Cu alte cuvinte, virgula are rolul unui „SI" în care ordinea celor două elemente constitutive nu este indiferentă. Dacă nu ne-ar fi interesat decît prezenta ambelor componente, nu si ordinea lor, puteam folosi conectorul ampersant („&"): „(prenume & nume)".
În fisierul „persoana2.dtd" am folosit conectorul „|" pentru a exprima faptul că un atribut poate lua o valoare (si numai una!) din lista dată. În mod similar, conectorul „|" poate fi folosit pentru a specifica alegerea unei singure componente dintr-o listă de posibilităti. Spre exemplu, dacă sub-componentele lui „persoana" erau definite ca „(prenume | nume)", o persoană corect definită ar avea fie numai nume, fie numai prenume.
Pe lîngă conectorii amintiti, SGML mai permite folosirea lui „+", „-" si „*" pentru a exprima repetabilitatea unei componente. Astfel, „(NumarTelefon +)" desemnează „unul sau mai multe numere de telefon", „(NumarTelefon ?)" semnifică „maxim un numar de telefon" (adica unul sau niciunul), iar „(NumarTelefon *)" înseamnă „zero sau mai multe numere de telefon". În concluzie, putem afirma că diversele combinatii ale conectorilor amintiti oferă o flexibilitate deosebită în definirea documentelor.
Editoarele de texte nu sînt nici pe departe unicul domeniu de utilizare al SGML-ului. Comertul electronic, aflat în plin avînt în America, se foloseste la rîndul său de documente SGML. Spre exemplu, un agent inteligent care „rătăceste" prin Internet cautînd un obiect anume pentru „stăpînul" său nu are cum „întelege" toate formatele în care potentialii furnizori electronici îsi codifica informatiile. În consecintă, o posibilă solutie constă în a-i da posibilitatea fiecărui comerciant electronic să-si păstreze catalogul de vînzări în format SGML. Cum pornind de la fisierele DTD si SGM un program poate obtine extrem de usor descrierea fiecărui produs oferit spre vînzare, modul în care diversii furnizori folosesc SGML-ul pentru a păstra informatia nu are nici o importantă.
Pentru a stăpîni SGML-ul si pentru a-i putea cunoaste cu adevarat subtilitatile este absolut necesar să creati cîteva exemple de documente. Din punct de vedere practic, verificarea corectitudinii unui document se poate face cu ajutorul unui parser SGML. Un astfel de parser poate fi procurat gratuit prin FTP anonim de la adresa „ ftp.ifi.uio.no/SIGhyper/SGMLUG/distrib" din directorul „ ".
Dacă sînteti interesat să folositi SGML-ul în cadrul aplicatiilor dumneavoastră, vă recomandăm două puncte „hot" de pe Internet. Primul ar fi grupul „comp.text. sgml" din cadrul Usenet Newsgroups. Utilizatori SGML din întreaga lume folosesc acest „forum" pentru a-si expune părerile si pentru a-si împărtăsi experienta. Un alt punct de maxim interes ar fi lista de discutii electronice a grupului „Text Encoding Initiative". Acest grup de cercetători se ocupă de utilizarea SGML în schimbul de informatii aflate sub formă electronică. Trimitînd la adresa „" un email cu continutul „subscribe TEI-L NumeleDumneavoastra" veti deveni „abonat" la lista de discutii si veti putea participa la dezbaterile (electronice) care au loc. Succes!