V současné době, kdy požadovaná dynamika zpracování a výměny informací klade zvýšený důraz na možnost bezešvé výměny informací mezi jednotlivými SW komponentami, se do popředí zájmu vývojářů a následně i uživatelů dostávají technologie, které umožňují tyto požadavky uspokojovat. Součástí takových technologií je často i XML (eXtended Markup Language).
Tento článek není určen uživatelům prakticky pracujícím s formáty XML, ale čtenářům, kteří se ze zkratkou XML již setkali, ale dosud se s její interpretací hlouběji neseznámili. Budeme se snažit spíše osvětlit kontext, ve kterém je vhodné přemýšlet o užití XML, než o popis jeho konkrétní syntaxe a sémantiky. XML jako takovému, zejména jeho DTD a možnostem dotazů nad XML texty, bychom se chtěli věnovat v dalším, samostatném článku.
Snaha o zpřehlednění textů formalizováním jejich struktury je starší než historie elektronických počítačů a jejich využití pro zpracování textů. Ale právě využití elektronických počítačů jako nástrojů pro zpracování textů klade velký důraz na explicitní formalizaci zpracovávaných textů. Jedním z hlavních důvodů tohoto důrazu je neschopnost současných nástrojů "domýšlet" si vágně definovanou strukturu textu. Dodržením definované formální struktury zpracovávaného textu dodáme chybějící informace na jejichž základě mohou i současné nástroje pracovat s logickou strukturou zpracovávaných textů.
Textem v tomto článku rozumíme textovou zprávu, která je produkována autorem (ale i SW komponentou) a je přijímána čtenářem (nebo jinou SW komponentou). Textem tedy může být soubor vytvořený za pomocí textového editoru a fyzicky uložený na disku počítače nebo zpráva, kterou si zasílají automaticky jednotlivé části informačního systému organizace. Textem v tomto smyslu budeme rozumět například i proud (stream) zpráv, které nemusí v jednom okamžiku existovat celé, ale jsou postupně vytvářeny a neprodleně zpracovávány. Současně za text v tomto slova smyslu považujeme i datové soubory, případně extrakty produkované databázemi.
Strukturovaným textem v tomto článku rozumíme text, do kterého autor zapracoval prostředky, kterými usnadňuje čtenáři čtení, pochopení a zpracování tohoto textu. Takovým prostředkem může být například vhodná typografická úprava textu nebo zvolený typ číslování kapitol. Jako výhodnější se ale jeví strukturovat zpracovávaný text spíše podle logické struktury než podle (okamžitých) požadavků na jeho prezentaci.
Pro potřeby současného zpracovávání téhož textu čtenářem (člověkem) a případně vzájemně nezávislými SW komponentami je výhodné užít ke strukturování textu značek vhodného značkovacího jazyka. Značky můžeme zjednodušeně popsat jako poznámky v textu dělící text na logické části, které budeme nazývat prvky. Souhrn pravidel pro doplňování značek do textu nazveme značkovacím jazykem. Samotný proces doplňování značek do textu někdy označujeme jako značkování textu.
Snad první značkovací jazyk GML (Generalized Markup Language) byl vyvinut na půdě firmy IBM z důvodu potřeby popisovat, uchovávat a zpracovávat různé typy právních textů. Možná i proto byl navržen velice robustně a flexibilně. V 80-tých letech začala organizace ISO na základě tohoto jazyka připravovat normu standardního značkovacího jazyka. Po spojení aktivity vyvíjející GML s aktivitami pracujícími na podobných projektech byl roku 1986 definován standard SGML (Standard Generalized Markup Language). Tento jazyk má značnou vyjadřovací sílu a současně je velice flexibilní. I proto byl zvolen jako jazyk pro popis natolik různorodé dokumentace, jako je dokumentace vyžadovaná americkým ministerstvem obrany. Tento jazyk si zvolila například i společnost Boing Aircraft Co. pro popis a správu rozsáhlých manuálů (tisíce stran) s životností nejméně 30 let. Síla SGML je ale vykoupena jeho velkou složitostí a komplikovaností. Díky tomu je nesnadné vytvořit nástroj, který pokrývá celou šíři tohoto jazyka. Proto byly následně na základech SGML vytvořeny jednodušší jazyky (HTML, XML), které se i přes svoji "omezenou" vyjadřovací sílu značně rozšířily. Dále se proto budeme věnovat těmto jednodušším, ale současně uchopitelnějším jazykům.
Značkovací jazyky užívají jako značek k oddělení jednotlivých prvků zpracovávaného textu definovaných posloupností znaků. Posloupnost znaků, která je značkou, se nesmí vyskytovat ve zpracovávaném textu jinak, než právě v roli značky definující jednotlivé prvky.
Některé značkovací jazyky užívají pouze jediný druh značky oddělující navzájem jednotlivé prvky. Velice rozšířené jsou ale jazyky se dvěma různými typy značek, jeden typ odděluje jednotlivé prvky a druhý typ odděluje skupiny prvků. Příkladem takového jazyka může být například formát csv (Comma Separated Variables), kde jsou jednotlivé prvky (pole) odděleny pomocí čárek a skupiny prvků (věty) jsou odděleny pomocí konců řádků. Dále například existují značkovací jazyky, které užívají víceznakové značky nebo odlišně definované značky označující začátek prvku a značky označující konec prvku.
Klasifikovat jednotlivé značkovací jazyky lze z různých hledisek. Z pohledu základní interpretace značek je můžeme dělit na:
Procedurální značka definuje pro prvek konkrétní akci, která se má s prvkem provést. Deklarativní značka definuje prvek jako logickou část v rámci značkovaného textu.
Zatímco procedurální značka například definuje, že určitý prvek textu bude vytištěn pomocí fontu Arial o velikosti 13 bodů, deklarativní značka například říká, že určitý prvek zpracovávaného textu je křestní jméno.
Rozdíl v uvedeném pojetí značek se projeví hlavně v případech, kdy chceme zpracovávat jediný značkovaný text několika různými způsoby. Text můžeme rozdělit na prvky pomocí procedurálních značek, které budou odpovídat přesně takovému zpracování, které chceme s textem provést. Jako příklad procedurálního značkovacího jazyka zde můžeme uvést jazyk HTML (HyperText Markup Language) pomocí kterého je značkovaná velká část stránek WWW nebo RTF (Rich Text Format) užívaný jako výměnný formát mezi textovými procesory T602, MS Word, ...
Text značkujeme pomocí značek v HTML následujícím způsobem:
(1) <b>Jan Novák</b> <i>tel. 456 123</i>
Po zpracování dostáváme výstup
"Jan Novák tel. 456 123".
Pokud text budeme značkovat jako
(2) <b>Jan</b> <b>Novák</b> <i>tel. 456 123</i>
dostaneme po zpracování stejný výstup jako v příkladu (1). Z hlediska definice procedurálních značek je v příkladu (2) nadbytečné rozdělení jména a příjmení, protože je v případě použitých procedurálních značek ekvivalentní s příkladem (1). Prvek definovaný v HTML pomocí značek <b></b> je vždy formátován tučně, prvek definovaný v HTML pomocí značek <i></i> je vždy formátován jako kurzíva.
Pokud budeme tentýž text značkovat pomocí deklarativních značek (pro jednoduchost zde budeme užívat velice jednoduchý značkovací jazyk podobný XML) bude značkovaný text vypadat například takto:
(3) <ucastnik> <jmeno>Jan</jmeno> <prijm>Novák</prijm> <nav>tel.</nav> <tel>456 123</tel> </ucastnik>
V telefonním seznamu má každý účastník (<ucastnik>) uvedeno svoje jméno (<jmeno>), příjmení (<prijm>) a telefonní číslo (<tel>).
Na rozdíl od procedurální značky nám deklarativní značka neříká nic o požadovaném zpracování textu, ale například jasně rozlišuje mezi křestním jménem a příjmením. Pro finální zpracování deklarativně značkovaného textu je třeba ještě definovat další soubor/text, který pro konkrétní požadovanou úlohu přiřadí každému prvku požadované zpracování. Tento soubor (script), je závislý na nástroji, který jej bude interpretovat a současně tak zpracovávat značkovaný text, například značkovaný text příkladu (3).
Pro ilustraci zpracování značkovaného textu scriptem definujme velice jednoduchý jazyk, který bude formátovat jednotlivé prvky následovně: <tucne><element></tucne> bude interpretován jako příkaz k vysázení prvku <element> tučně. Podobně pro kurzívu.
(4) <tucne><jmeno></tucne> <tucne><prijm></tucne> <italika><nav></italika> <italika><tel></italika>
Aplikací tohoto scriptu na značkovaný text (3) dostáváme stejný výsledek jako v příkladu (1) a (2): "Jan Novák tel. 456 123".
Lze si ale představit jinou aplikaci, která bude zpracovávat tentýž značkovaný text z příkladu (3). Tato aplikace sestaví telefonní seznam, kde na prvním místě bude příjmení účastníka a kde není třeba před každým telefonním číslem uvádět, že jde o telefonní číslo. Definujeme pouze nový script a nijak nezasahujeme do značkovaného textu.
(5) <tucne><prijm></tucne> <tucne><jmeno></tucne> <italika><tel></italika>
Výsledkem zpracování tímto novým scriptem je text "Novák Jan 456 123". V tomto příkladu jsme nejenom definovali typografickou úpravu výsledného textu, ale i jeho obsahovou změnu (změna pořadí prvků a současně vynechání pro tuto konkrétní úlohu nadbytečného prvku <nav>).
Z předchozích příkladů je patrné, že zpracování textu značkovaného pomocí deklarativních značek je poněkud složitější, protože do zpracování vstupuje soubor na jehož základě jsou pro jednotlivé deklarativní značky definovány operace, kterými mají být příslušné prvky zpracovány. Na druhé straně je zpracování deklarativních značek podstatně flexibilnější. Při změně úlohy často stačí předefinovat script a vlastní značkovaný text zůstává beze změny. Je třeba si uvědomit, že značkované texty mohou být velice rozsáhlé.
Metadata značkovaného textu jsou (velice zjednodušeně řečeno) informace o tom, jak jsou jednotlivé prvky v textu definovány, jaké jsou jejich vzájemné vztahy a jak jsou interpretovány. V dalším textu budeme mluvit pouze o deklarativních typech značek.
Metadata mohou být uložena přímo ve značkovaném textu (6), kdy jsou jednotlivé značky definovány jako samovysvětlující. (například prvky <jmeno> nebo <prijm>)
(6) <ucastnik> <jmeno>Jan</jmeno> <prijm>Novák</prijm> <nav>tel.</nav> <tel>456 123</tel> </ucastnik> <ucastnik> <prijm>Dvořák</prijm> <nav>tel.</nav> <tel>321 456</tel> </ucastnik> <ucastnik> <jmeno>Karel</jmeno> <prijm>Dvořáček</prijm> <nav>tel.</nav> <tel>456 321</tel> </ucastnik>
Výhodou tohoto typu uložení je úplná definice obsahu prvků i jejich struktury v jediném souboru. Nevýhodou je například redundance údajů o každém prvku. Informace o struktuře prvků je rozptýlená a může dojít například ke ztrátě informace o možných strukturách pokud není ve zpracovávaném textu instance této struktury. Druhý záznam například neobsahuje prvek <jmeno>. Pokud bychom měli k dispozici pouze tento záznam, pak bychom o existenci prvku <jmeno> nevěděli.
Metadata značkovaného textu mohou být ale umístěna i mimo vlastní zpracovávaný soubor (například csv formát, kdy popis významu jednotlivých polí je mimo vlastní zpracovávaný text), kdy jsou data oddělena jednotlivými značkami (v případě csv formátu je touto značkou čárka), ale popis jednotlivých prvků je ve zvláštním souboru. Metadata v tomto případě představuje mapovací tabulka
(7) prvek1 = Jméno;...; prvek4 = Telefon. prvek1, prvek2, prvek3, prvek4 Jan,Novák,tel.,456 123 ,Dvořák,tel.,321 456 Karel,Dvořáček,tel.,456 321
Výhodou tohoto způsobu uložení metadat je centralizované uložení informace. Druhý záznam sice nemá uvedený 1. prvek, ale v mapovací tabulce je o prvku 1 informace. Nelze tedy na tento prvek ze zpracování vynechat.
Třetím způsobem uložení metadat značkovaného textu je jejich uložení jak do zpracovávaného textu tak do externího souboru. Ve značkovaném textu jsou užity značky, které definují jednotlivé prvky a v externím souboru jsou uloženy informace o povolených vzájemných vztazích jednotlivých značek.
Výhodou textů značkovaných pomocí vhodných značkovaných jazyků je mimo jiné i možnost jejich hromadného zpracování (například kladení dotazů). Díky jednoznačné a současně poměrně jednoduché identifikaci konkrétního prvku v textu lze následně definovat potřebné operace přímo s jednotlivými prvky.
Aby bylo možno jednoznačně popsat konkrétní prvek ve zpracovávaných textech je třeba definovat DTD (Document Type Definition, definice struktury dokumentu, který je zpracováván). Odlišnou strukturu má kniha, telefonní seznam nebo třeba formální dopis. Každý z uvedených dokumentů má svoje specifické DTD.
Jako příklad lze uvést DTD telefonního seznamu z příkladu (6). Pro potřeby tohoto textu je užit zjednodušený zápis blízký DTD pro XML schéma.
(8) ... <complexType name="ucastnik"> <sequence> <element name=""jmeno"" minOccurs=""0""/> <element name=""prijm""/> <element name=""nav"" value=""tel.""/> <element name=""tel"" /> </sequence> </complexType> ...
Uvedené schéma popisuje prvek účastníka, kde nemusí být zadáno křestní jméno a návěští je standardně vyplněno řetězcem "tel.".
Pokud mají všechny zpracovávané dokumenty stejná DTD, případně mají stejné ty části DTD, kterých se týká zpracování, pak lze hromadně zpracovávat texty i na úrovni jednotlivých prvků. Otevírá se tak reálná možnost nezávislého zpracování částí textů.
Vzhledem k tomu, že definice DTD dokumentu má přímý dopad na budoucí využití značkovaných textů, je třeba tuto definici založit robustně a současně flexibilně. Robustnost by měla zaručit poměrnou stabilitu definice při zpracování dokumentů, které tímto DTD popisujeme, a flexibilita by měla zaručit možnost zachycení dalšího vývoje dokumentu tak, jak se mění požadavky uživatelů tohoto dokumentu.
Prostřednictvím DTD poskytují značkovací jazyky nástroje, které umožní abstraktně popsat strukturu všech přípustných dokumentů pro konkrétní aplikaci. Lze tak odlišit například poškozené nebo neúplné dokumenty už na počátku zpracování. Na základě DTD je možné v neposlední řadě definovat i vyhodnotit dotazy, které lze klást na značkované texty.
Explicitní popis dokumentů pomocí DTD umožní lepší porozumění těmto dokumentům i ze strany jejich tvůrců a uživatelů.
Text, který je značkován pomocí deklarativních značek je možno dále efektivně zpracovávat. Takovým zpracováním může být například typografické formátování textu, tak jak bylo stručně nastíněno v úvodních příkladech tohoto článku.
Značkované texty jsou ale i dobře zpracovatelné dotazovacími nástroji. Dotazovací nástroj může využít nejen prohledávání pomocí klíčových slov, případně pomocí jejich předpokládaných souvislostí, ale i na základě explicitního označení slova, případně skupiny slov, konkrétní deklarativní značkou. Prvek definovaný deklarativní značkou popisuje logickou strukturu textu a této struktury může vyhledávací stroj využít.
Texty značkované pomocí deklarativních značek lze lépe zpracovávat i po obsahové stránce. Na základě prvků popisujících zájmovou oblast uživatele je možno sestavovat nové dokumenty obsahující souhrnné údaje o zájmové oblasti, které byly rozptýleny v původních textech. Lze si představit i využití tranzitivních závislostí implicitně vyplývajících z definovaných DTD jednotlivých typů dokumentů - například automatickou rešeršní službu, která bude zpracovávat texty na základě logické struktury deklarativních značek.
Jedním z projektů, který definuje prostředky pro popis dokumentů pomocí deklarativních značek je projekt Dublin Core. Cílem tohoto projektu je mimo jiné značkovat popisy dokumentů takovým způsobem, aby bylo možno tyto popisy automaticky zpracovávat. Příkladem takového zpracování jsou vyhledávače umožňující sofistikovanější hledání a nalézání potřebných dokumentů nebo možnost snazšího přenosu popisů dokumentů mezi různými systémy.
V předchozích odstavcích jsme se zmínili o některých obecných rysech značkovacích jazyků. Pro uživatele, rozhodujícího se který ze stávajících značkovacích jazyků užít, případně zda budovat vlastní proprietární systém, lze doporučit jako zajímavou alternativu jazyk XML.
Na druhé straně je třeba si uvědomit, že XML je nástroj a jako takový sám o sobě nemůže vyřešit například sémantické problémy zpracování textu.
V dalším článku se zaměříme už přímo na jazyk XML. Po stručném popisu vlastního značkování, které využívá jazyk XML se soustředíme především na definici DTD a využití tohoto DTD pro některé operace nad značkovaným textem. Všimneme si také definice dotazů nad dokumenty značkovanými pomocí XML.