Všechny jazyky založené na SGML (zejména tedy HTML a XML) využívají k zápisu specifických, jinak obtížně definovatelných znaků, takzvané entity. Ty jsou v zásadě dvojího druhu: buďto se odkazují symbolickým jménem na určitý znak a nebo obsahují číselnou specifikaci dle normy ASCII či UNICODE.
Například znak pro copyright - © - lze entitou zapsat třemi způsoby:
©
– symbolické jméno©
– ASCII/UNICODE desítkově©
– ASCII/UNICODE šestnáctkově
Z hlediska uživatele je samozřejmě nejpříjemnější první varianta, tedy použití symbolického jména a konstrukcí jako například:
< > & " '
– < > & “ ‘
- pevná mezera© ® ™
- © ® ™« »
- « »° ′ ″
- ° ' ”½ ¼ ¾
- 1 1 3
Kompletní seznam najdete například na Wikipedii.
Problém s XML
Všechny shora uvedené formy zápisu vám budou bez problémů fungovat v HTML nebo XHTML dokumentu. V prostém XML však nikoliv. Pro XML jsou definovány pouze numerické entity (zapsané desítkově či šestnáctkově) a pětice entit pro speciální znaky: < > & " '
Často ale chcete, aby součástí XML dokumentu byly i jiné entity. Patrně nejtypičtějším případem je entita
, která se nám bude hodit v případě psaní XSLT šablon pro konverzi XML do HTML.
Naivní (a nefunkční) zápis vypadá takto:
<?xml version="1.0" encoding="utf-8" ?>
<root> </root>
Při pokusu o zpracování XML se však potkáme s nemilou chybovou hláškou:
Entity můžeme v XML deklarovat i sami tak, že je zapíšeme pomocí něčeno, co XML už zná – pomocí numerických kódů. Druhý pokus využívá konstrukt !ENTITY
a vypadá takto (root
ve specifikaci DOCTYPE je název kořenového elementu, pokud se váš bude jmenovat jinak, je nutno ho změnit i zde):
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE root [
<!ENTITY nbsp " ">
]>
<root> </root>
Tento zápis vyhoví, pokud je entit málo. Zapisovat takto všechny entity definované pro HTML v každém XML dokumentu by bylo poněkud nepraktické. S výhodou lze využít funkce DOCTYPE, která umožňuje odkaz na externí specifikaci. V našem případě se prostě odkážeme na specifikaci XHTML a seznam entit si vypůjčíme odtud:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE root [
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
<!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
<!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
%HTMLlat1;%HTMLspecial;%HTMLsymbol;
]>
<root> ©</root>
Posledně uvedenou konstrukci stačí vložit na začátek každého XML dokumentu, v němž chcete používat HTML entity a máte vystaráno.