Documentele viitorului si viitorul documentelor

SDGML este un standard ISO de reprezentare a documentelor. Multiplele sale aplicatii, de la procesarea de texte la schimbul de informatii între agentii inteligenti, au dus la impunerea rapidă a SGML-ului.

Ionut Muslea

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ă.

Un prim exemplu de document

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 „<persoana>" reprezintă marcajul de început al elementului structural „persoana", iar „</persoana>" constituie marcajul terminator al respectivului element structural, întelegerea documentului nu pune nici un fel de probleme. Linia a doua a fisierului „persoana1.sgm" declară începutul unei structuri de tipul „persoana", iar a treia si a patra linie indica faptul că sub-componentele „prenume" si „nume" au drept continut stringurile „ionut", respectiv „muslea". Ultima linie specifică terminarea structurii „persoana".

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 „<persoana>", cît si „</persoana>" trebuie să apară obligatoriu în cadrul documentului (există situatii în care unul sau chiar ambele marcaje pot lipsi, fiind subîntelese). Următoarele linii ale fisierului furnizează informatii legate de sub-componentele „prenume" si „nume": ambele sînt de tipul „CDATA" („Charater DATA", adică un sir de caractere) si trebuie să fie încadrate de marcajele de început si sfîrsit de componentă.

Elemente si atribute

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 „<!ELEMENT" si, în consecintă, sînt declarate ca fiind elemente ale unui document. Cu alte cuvinte, un document SGML poate avea o componentă de tip „persoana", care la rîndul ei are sub-componentele „nume" si „prenume". Cum descrierea unui element numai prin componentele sale nu oferă suficientă expresivitate, SGML permite si utilizarea atributelor. Marea diferentă dintre un element si un atribut constă în aceea că primul defineste o caracteristică structurală, pe cînd al doilea are o functie de natură descriptivă. Spre exemplu, faptul că un măr e rosu si rotund poate fi descris cu ajutorul atributelor, pe cînd structura sa (codită, coajă, miez, cotor, sîmburi) se pretează mai bine unei descrieri bazate pe elemente.

Î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 „<!ATTLIST" urmat de numele componentei descrise de atribut, de numele atributului si de lista posibilelor valori ale acestuia. Aceasta din urmă este încadrată între paranteze rotunde, iar diversele valori sînt separate prin caracterul „|". În fine, lista în cauză este urmată de o valoare implicită a atributului. Spre exemplu, nespecificarea culorii ochilor în fisierul „persoana2.sgm" implică folosirea valorii ei implicite: „caprui".

Entităti

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".

Conectori

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.

Go for it!

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 „LISTSERV@UICVM.BITNET" 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!


(C) Copyright Computer Press Agora