XML pro web aneb od teorie k praxi - 7.díl

Dnes se budeme věnovat atributům xml:lang a xml:space, prozkoumáme, jak se v XML zachází s bílými znaky a konci řádků. Objasníme si, co znamené normalizace hodnot atributů a nakonec se podrobněji podíváme na atribut standalone. Dnešním dílem ukončíme sérii věnovanou obecným základům XML, abychom se přístě mohli začít zabývat praktičtějšími aplikacemi.

Identifikace použitého jazyka - atribut xml:lang

XML počítá s internacionalizací - výchozím kódováním je Unicode, takže zápis rozličných znaků v XML dokumentu nečiní problémy. Ovšem možnost zápisu jakéhokoliv znaku někdy nemusí stačit. Občas je potřeba identifikovat, v jakém jazyce je dokument či jeho části. Jazyky se mohou lišit ve směru zápisu znaků (zleva doprava nebo zprava doleva...), mají jinou výslovnost (to je důležité např. pro prohlížeče s hlasovým výstupem), slova a slovní spojení nesou různé významy (např. slovo "most" znamená v češtině a v angličtině něco zcela jiného), atd.

Proto v XML existuje atribut xml:lang. Tento atribut lze použít u kteréhokoliv elementu. Určuje, v jakém jazyce je zapsán obsah tohoto elementu a také obsah atributů tohoto elementu. Platí i na všechny potomky elementu, dokud není "přepsán" jinou hodnotou tohoto atributu u kteréhokoliv z vnořených elementů.

Hodnotou atributu xml:lang je kód jazyka, za kterým může volitelně následovat pomlčka a subkód. Kód jazyka může mít následující formu:

  • Dvoupísmenný kód podle normy ISO 639. Může být následován subkódem země podle normy ISO 3166. Např. en-GB.
  • Identifikátor jazyka registrovaný IANA - musí být opatřen prefixem i-.
  • Jiný libovolný identifikátor, určený pro soukromé použití (či dohodnutý více stranami) - musí být opatřen prefixem x-, aby nedoslo ke konfliktu se standardizovanými jmény.

Obvykle bývá kód jazyka psán malými písmeny a subkód (země) velkými. Není to ovšem nutnost, pouze používaná konvence - hodnoty atributu xml:lang nejsou citlivá na velikost písmen. Použití si ukážeme na příkladu (který je převzat z normy XML na W3C, jelikož lepší příklad bych stěží vymyslel :) ):


<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
<p xml:lang="en-GB">What colour is it?</p>
<p xml:lang="en-US">What color is it?</p>
<sp who="Faust" desc="leise" xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
 <l>durchaus studiert mit heißem Bemüh`n.</l>
</sp>

Při používání atributu xml:lang ve validních XML dokumentech je nutné jej deklarovat v DTD. Například takto:

<!ATTLIST p xml:lang NMTOKEN #IMPLIED>

Zacházení s bílými znaky

Součástí znakových dat (připomeňme, že znaková data jsou vlastně veškerý text obsažený uvnitř elementů, tj. vše mimo samotné značkování) jsou i takzvané bílé znaky (white space). Bílé znaky nemají viditelnou podobu, jsou to vlastně příkazy určené k formátování textu. Řadí se mezi ně mezera, tabelátor, CR (Carriage Return, tj. "návrat vozíku"), LF (Line Feed, tj. posun o řádek). Často se bílé znaky vyskytují jako nástroj pro lepší čitelnost zdrojového kódu a nemají žádný význam pro obsah XML dokumentu. Naopak v některých případech jsou bílé znaky (tj. formátování) v textu důležité, jedná-li se například o poezii, nebo ukázku výpisu zdrojového kódu.

V XML platí pravidlo, že všechny bílé znaky, které jsou součástí textu (znakových dat) musí XML procesor předat aplikaci. Není tím ovšem nijak určeno, jak se má k bílým znakům zachovat aplikace.

Speciálním případem jsou bílé znaky, které se nacházejí uvnitř elementů s elementovým obsahem (jejich deklarace v DTD říká, že smějí obsahovat pouze elementy, nikoliv znaková data). Oproti elementům s deklarovaným smíšeným obsahem (které mohou obsahovat jak elementy, tak i text, jehož součástí mohou být bílé znaky) jsou bílé znaky uvnitř elementů s elementovým obsahem zcela jasně určeny pouze pro vizuální strukturaci zdrojového kódu XML dokumentu. Proto validizující XML procesor musí informovat aplikaci o speciálním významu těchto bílých znaků, pokud se nacházejí v kontextu elementu s elementovým obsahem.

Atribut xml:space

Zpracování bílých znaků v textu (znakových datech) je už zcela závislé na aplikaci. Aby bylo možné vyznačit, kde jsou bílé znaky důležité přesně v té podobě, v jaké se objeví v XML dokumentu, a kde nikoliv, vznikl atribut xml:space. Atribut nabývá dvou hodnot:

  • default - tato hodnota značí, že aplikace může pro zpracování bílých znaků v textu, který je obsahem příslušného elementu, použít své výchozí nastavení
  • preserve - tato hodnota aplikaci říká, že všechny bílé znaky je potřeba zachovat v nezměněné podobě.

Hodnota atributu se dědí na všechny potomky daného elementu, dokud nemá některý z těchto potomků explicitně uveden tento atribut s opačnou hodnotou. U validních dokumentů je nutné atribut xml:space deklarovat u všech typů elementů, u kterých ho potřebujeme použít. Deklarace vypadá například takto:

<!ATTLIST výpis-kódu xml:space (default|preserve) `preserve`>

Zacházení s konci řádků

V textových souborech na různých systémech (Windows, Unix, Mac) se používají odlišné kombinace znaků CR a LF pro ukončení a přechod na nový řádek. Aby se zabránilo možné nekompatibilitě, XML procesor nahrazuje všechny sekvence znaků CR,LF a všechny osamoceně stojící znaky CR, za znak LF. Cílem je, aby všechny konce řádků měly (ještě před začátkem analyzování XML dokumentu) jednotnou podobu - znak LF.

Normalizace hodnot atributů

Před tím, než XML procesor předá hodnoty atributů cílové aplikaci (nebo před kontrolou validity vůči DTD), musí proběhnout proces normalizace hodnot atributů. Krátce řečeno se jedná o to, aby bílé znaky či entity nezasahovaly do hodnoty atributu. Proces normalizace vypadá takto:

  • Znakové reference jsou nahrazeny příslušným znakem.
  • Reference na entitu je nahrazena obsahem (textem) příslušné entity.
  • Bílé znaky (mezera, CR, LF, tabelátor) jsou nahrazeny mezerou. Kombinace znaků CRLF, používaná pro přechod na další řádek, je nahrazena pouze jednou mezerou.

Praktické důsledky této procedury si ukážeme na příkladu. část XML dokumentu (element s atributem) může reálně vypadat takto:


<kategorie název=" Java
/ 
&JS;
" />

Po normalizaci by měl výsledný kód následující podobu:

<kategorie název=" Java / JavaScript " />

Pokud má atribut v deklaraci jiný typ, než CDATA (tj. např. ID, IDREF, NMTOKENS...), musí XML procesor odstranit všechny mezery na začátku a na konci hodnoty atributu a poté, pokud se někde vyskytne více než jeden znak mezery za sebou, tyto sekvence nahradit jedinou mezerou.

Nevalidizující XML parsery (tj. ty, které umí zkontrolovat pouze jestli je dokument správně strukturovaný, ale neumi zkontrolovat platnost dle DTD) zacházejí při normalizaci atributů se všemi hodnotami tak, jako kdyby byly typu CDATA (je to logické, protože takový parser neumí získat informaci o typu atributu z DTD).

Deklarace samostatného dokumentu - atribut standalone

Ve druhém dílu tohoto seriálu byla řeč o XML deklaraci a atributu standalone. Vysvětlení významu atributu bylo odsunuto a nyní tedy přišel čas se k tématu vrátit a ozřejmit úlohu tohoto atributu.

XML dokument může obsahovat značkování (markup), které není fyzickou součástí dokumentu, ale ovlivňuje to, jak konečný dokument vypadá. Příkladem jsou deklarace entit, nebo deklarace výchozích hodnot atributů v externím subsetu DTD - pokud nebude mít XML procesor k dispozici soubor obsahující takové externí DTD, bude to ovlivňovat obsah samotného dokumentu zpracovávaného XML procesorem. Právě proto existuje atribut standalone. Může nabývat pouze dvou hodnot - yes a no. O významu atributu vypovídá už jeho název (standalone = "samostatný, nezávislý"). Určuje, jestli dokument stojí "sám o sobě", jestli nějaké značkování z externích souborů nemění vlastní obsah XML dokumentu.

Pokud XML dokument neobsahuje žádné externí značkování (tj. externí subset DTD nebo externí parametrickou entitu, na kterou se objevuje reference v interním subsetu), pak atribut standalone nemá žádný význam. Atribut standalone s hodnotou yes se používá v případě, že v externím značkování nejsou žádné deklarace, které by ovlivňovaly obsah dokumentu nebo způsob čtení dokumentu XML procesorem. Pokud má dokument vnější značkování ale atribut standalone není specifikován, XML procesor předpokládá hodnotu no. Hodnotu no nabývá atribut standalone v případě, že:

  • Externí značkování obsahuje deklaraci atributu s výchozí hodnotou. To ovšem neplatí pokud se element, pro který je tento atribut s výchozí hodnotou deklarován, v příslušném dokumentu nikde nevyskytuje bez explicitního uvedení tohoto atributu.
  • Externí značkování obsahuje deklaraci entity a v XML dokumentu se objeví reference na tuto entitu. Neplatí pro deklarace předdefinovaných entit.
  • Externí značkování obsahuje deklarace atributu, jehož hodnota podléhá normalizaci, a v dokumentu se hodnota tohoto atributu vyskytuje v podobě, která může být normalizací pozměněna.
  • Externí značkování obsahuje deklaraci elementu s elementovým obsahem a tento element v XML dokumentu obsahuje bílé znaky.

Většinou atribut standalone není potřeba použít, ale typicky se může hodit v případech, že dokument má externí značkování, které neovlivňuje obsah dokumentu - explicitním uvedením atributu standalone a hodnoty yes v některých případech "ulehčíme život" aplikaci tím, že nebude nutno stahovat další soubory.

Tolik tedy obecně o XML. Příště už vám mohu slíbit poněkud zábavnější "kaši" - podíváme se na jmenné prostory a ukážeme si, jak s pomocí jmenných prostorů přidávat vlastní elementy do (X)HTML stránky.

Váš názor Další článek: Internet po elektrické síti

Témata článku: Software, Prohlížeče, Programování, Unicode, Mezera, Space, Znak, Různé znaky, XML, Hlasový příkaz, Význam, Element, Teorie, Reference, Důležitá součást, What, Obsah, Důležitý soubor, Deklarovaná data, Code

Určitě si přečtěte


Aktuální číslo časopisu Computer

Test 6 odolných telefonů a 22 powerbank

Srovnání technologií QLED a OLED

Měřte své sportovní výkony

Sady pro chytrou domácnost