Az egyedek felhasználásával neveket tudunk rendelni a tartalom egyes darabjaihoz. Az SGML elemző a dokumentum feldolgozása közben ezeket az egyedeket megtalálja és helyükre beszúrja az általuk hivatkozott tartalmat.
Ezzel az SGML dokumentumokban könnyedén ki tudunk alakítani újrafelhasználható, gyorsan cserélhető tartalmat, illetve kizárólag ezen a módon lehet jelölőkkel ellátott SGML állományokat beletenni egy másik hasonló SGML állományba.
Az egyedek kétfajta típusa létezik, amelyek mindegyike eltérő helyzetekben használható: ezek az általános egyedek és a paraméteregyedek.
Általános egyedeket nem lehet SGML környezetben használni (habár definiálni igen), egyedül magában a dokumentumban. Vessük össze a paraméteregyedekkel.
Mindegyik általános egyed rendelkezik egy névvel. Így tudunk hivatkozni egy általános egyedre (ezáltal mindarra a szövegre, amelyet képvisel a dokumentumunkban): &egyednév;. Vegyük például, hogy van egy jelenlegi.valtozat nevű egyedünk, amely a termékünk jelenlegi verziószámát helyettesíti be a szövegbe. Ezt így fogalmaznánk meg:
<para>A termékünk jelenlegi változata a(z) &jelenlegi.valtozat;.</para>
Így a verziószám változásakor egyszerűen csupán az általános egyed definícióját kell megváltoztatni, majd újra feldolgozni a dokumentumot.
Az általános egyedek segítségével olyan karakterek is megadhatóvá válnak, amelyeket egyébként nem tudnánk SGML dokumentumokban leírni. Például a < és a & normális esetben nem lehet része SGML dokumentumoknak. Amikor ugyanis az SGML elemző egy < szimbólumot észlel, feltételezi, hogy ezzel egy (kezdő- vagy záró) címke kezdődik, illetve amikor pedig egy & szimbólumot talál, akkor a következő lépésben egy egyed nevét várja.
Szerencsére ezek a szimbólumok a szövegben bármikor kiválthatóak az < és & általános egyedek használatával.
Általános egyedek csak SGML környezetben definiálhatóak. Ezeket általában közvetlenül a DOCTYPE deklaráció után sorolják fel.
Példa 3-10. Általános egyedek definíciója
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [ <!ENTITY jelenlegi.valtozat "3.0-RELEASE"> <!ENTITY legutolso.valtozat "2.2.7-RELEASE"> ]>
Figyeljük meg, hogy a DOCTYPE deklarációt a sor végén egy szögletes nyitó zárójel elhelyezésével kibővítettük: a kiegészítésként felvett két egyedet az utána következő két sorban definiáltuk, majd bezártuk a szögletes zárójelet és DOCTYPE deklarációt.
A szögletes zárójelek szükségesek ahhoz, hogy jelezzük a DOCTYPE deklarációban megadott DTD további kiegészítéseit.
Az általános egyedekhez hasonlóan a paraméteregyedek is újrafelhasználható szövegrészek elnevezését engedik meg. Miközben azonban az általános egyedek csak a dokumentumokban alkalmazhatóak, addig a paraméteregyedek csak SGML környezetekben használhatóak.
A paraméteregyedek az általános egyedekhez hasonló módon definiálhatóak, az &egyednév; felírás helyett azonban az %egyednév; alakban tudunk rájuk hivatkozni. Továbbá a definíciójukban az ENTITY kulcsszó és az egyed neve közé be kell szúrni a % (százalékjel) szimbólumot.
Példa 3-11. Paraméteregyedek megadása
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [ <!ENTITY % param.valami "valami"> <!ENTITY % param.szoveg "szöveg"> <!ENTITY % param.uj "%param.valami más %param.szoveg"> <!-- A %param.uj értéke most már "valami más szöveg" --> ]>
Ez most még nem tűnik különösebben hasznosnak. Később viszont majd az lesz.
Tegyük bele a próba.sgml állományunkba a következő általános egyedet:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [ <!ENTITY valtozat "1.1"> ]> <html> <head> <title>Egy minta HTML állomány</title> </head> <!-- Az állományba rakhatunk azért még megjegyzéseket --> <body> <p>Ebben a bekezdésben van egy kis szöveg.</p> <p>Ez a bekezdés még tartalmaz némi szöveget.</p> <p align="right">Ennek a bekezdésnek jobbra zártnak kellene lennie.</p> <p>A dokumentum jelenlegi változata: &valtozat;</p> </body> </html>
Az nsgmls használatával vizsgáltassuk meg a dokumentum érvényességét.
Töltsük be a próba.sgml állományt a böngészőnkbe (előfordulhat, hogy másolatot kell készíteni róla próba.html néven, mert a böngészőnk csak így ismerné fel HTML dokumentumként).
Hacsak a böngészőnk nem annyira fejlett, a dokumentumban a &valtozat; egyedhivatkozás nem fog lecserélődni a verziószámra. A böngészők többségében nagyon primitív elemzők találhatóak, amelyek nem képesek rendesen kezelni az SGML dokumentumokat[1].
A megoldást a dokumentum normalizálása jelenti, amelyet egy SGML normalizálóval tudunk elvégezni. A normalizáló beolvas egy érvényes SGML állományt és eredményként egy szintén érvényes, de valamilyen módon átalakított SGML állományt készít. Az SGML állományok átalakításának egyik ilyen módja a dokumentumban található egyedhivatkozások helyettesítése az általuk képviselt szöveggel.
Erre a célra az sgmlnorm használható.
% sgmlnorm próba.sgml > próba.html
Ennek hatására próba.html néven létrejön a dokumentum normalizált (vagyis a kifejtett egyedhivatkozásokkal létrehozott) változata, és most már betölthető a böngészőnkbe.
Ha most megnézzük az
sgmlnorm által gyártott
végeredményt, akkor tapasztalhatjuk, hogy az
elején nem szerepel DOCTYPE deklaráció.
Ezt a -d
kapcsolóval tehetjük
hozzá:
% sgmlnorm -d próba.sgml > próba.html
[1] | Micsoda szégyen! Képzeljük csak el, mennyi gondot és ügyeskedést (mint például a szerver oldalán beemelt állományokat) el tudnánk kerülni, ha rendesen támogatnák. |
Ha kérdése van a FreeBSD-vel kapcsolatban, a következő
címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése,
kérjük erre a címre írjon: <gabor@FreeBSD.org>.