Jak na HTML entity v XML dokumentech

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:

  • &lt; &gt; &amp; &quot; &apos; – < > & “ ‘
  • &nbsp; - pevná mezera
  • &copy; &reg; &trade; - © ® ™
  • &laquo; &raquo; - « »
  • &deg; &prime; &Prime; - ° ' ”
  • &frac12; &frac14; &frac34; - 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: &lt; &gt; &amp; &quot; &apos;

Často ale chcete, aby součástí XML dokumentu byly i jiné entity. Patrně nejtypičtějším případem je entita &nbsp;, 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>&nbsp;</root>

Při pokusu o zpracování XML se však potkáme s nemilou chybovou hláškou:

20080728-xml-bad

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 "&#160;">

]>

<root>&nbsp;</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>&nbsp; &copy;</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.

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET