SGML

Standard Generalized Markup Language (dle ISO 8879) je jazykem pro návrh tagových jazyků. SGML nám říká, jak takové jazyky formálně popisovat. Norma specifikuje, jak má tento popis formálně vypadat. SGML využívá rekurzivního okamžiku, kdy sám jsa tagovým jazykem, specifikuje, jak má návrh takových jazyků vypadat. Jde tedy o prostředek k návrhu tagových jazyků. Popisuje nám, jak se takové jazyky mají navrhovat (aby byl jejich návrh přiměřeně snadno použitelný). Tyto jazyky bez výjimky sestávají z tagů. Pomocí SGML tedy můžeme popsat, jak má jeden každý tag vypadat. Jak se jmenuje, jaké má atributy a co může být jejich obsahem. Stejně tak říká, které atributy (či tagy) jsou povinné, které zakázané, které implikované a které jsou vůbec povolené.

Všichni jsme již alespoň jednou SGMLský popis jazyka viděli, pokud jsme zalistovali normou HTML 4.0, které jsme se věnovali v prvních kapitolách tohoto materiálu. Norma totiž HTML 4.0 popisuje právě prostředky SGML.

XML

XML je zkratka eXtensible Markup Language. XML je upraveno doporučením W3-Consortia a jde o jeden z SGMLských jazyků. Tento jazyk by (podle toho, co nás učili již na střední škole) měl být použitelný prakticky čímkoliv (tedy měl by být snadno interpretovatelný), měl by být široce použitelný (tedy měl by být použitelný k popisu prakticky čehokoliv) a měl by být čitelný pouhým okem (mimo jiné proto, aby byl snadno napsatelný).

Původní představa byla taková, že každý kus zboží, který v obchodě zakoupíme, bude vybaven touto technologií (třebas v podobě RFID čipu [Radio Frequency Identification]). V souladu s představou bychom zboží naložili do košíku, došli bychom k pokladně, kde by místo prodavače sedělo zařízení schopné interpretovat XML (a počítat peníze, které jistě byly podle této utopické představy měly být také vybaveny identifikačním čipem, který by pomocí XML hlásil, že jde o peníze a o jaké). Automatizovaná pokladní by (přečtením údajů jednotlivých kusů zboží) spočetla tržbu, my bychom zaplatili, došli bychom domů, vyložili bychom nákup do lednice, která by si taktéž údaje o nákupu přečetla. Když bychom si následně z čerstvě přinesených potravin chtěli připravit večeři, lednice by nás začala sekýrovat: To pivo tu nech, protože vitamínů skupiny B jsi měl už dneska dost a místo toho si dej tu brokolici, co brzo začne v tom šuplíku zahnívat. K tomu se báječně hodí ty brambory, co už taky skoro tečou - nebylo by jistě špatné udělat si to podle odpoledne náhodně staženého receptu, který byl také popsán v XML a který získal průměrné hodnocení 8.2 při hodnocení celkem pěti čtenáři (při stupnici 1 - 10).

Ačkoliv se záměr návrhářů vpodstatě podařil, takhle daleko využití XML (zatím) naštěstí nedošlo. XML má tedy být jazykem snadno a široce použitelným (tedy mělo by být možné jím popsat téměř cokoliv), snadno interpretovatelným a použitelným na Internetu (což je velmi široký pojem, ale je asi nesporné, že nejčastěji používaným protokolem je HTTP, který přenáší data ve formátu holého textu a tudíž i XML operuje s formátem holého textu).

Byl tedy navržen jazyk poměrně neomezených možností, který se snadno parsuje. Technicky jde o jazyk, který obsahuje elementy (které je vhodné představovat si jako HTML-elementy). Tyto elementy jsou ohraničeny počátečním a koncovým tagem. Tagy jsou bez výjimky párové (srovnejte s HTML 4.0, které se má snadno generovat člověku a tedy tam, kde by párové tagy byly na obtíž, je párovost pouze volitelná [<p>...</p>], či dokonce zakázaná [</br>]). V případě XML tam, kde by byl párový tag na obtíž, je možné "samodružnost" oznámit u otevíracího tagu tak, že před zavírací zobáček umístíme lomítko: < br />

Všechno ostatní je záležitostí definice dokumentového typu (DTD). Tedy o tom, jaké tagy je třeba či doporučeno použít, rozhoduje DTD, což znamená, že XML-dokument dávající smysl jednomu přístroji (například pokladně, která automatizovaně počítá ceny), nemusí vůbec dávat smysl jinému přístroji (například lednici - pokud nakoupíme šrouby, vrtáky, kosu, luxusní pero a inkoust pro ně, nic z toho asi nebudeme chtít ukládat do lednice a tudíž tato nesrozumitelnost nebude na závadu). Je tak například možné navrhnout XML pro návrh divadelních her. Následující příklad je obkliknutý z doporučení W3 Consortia (http://www.w3.org/TR/REC-xml/). Popisuje fragment z Goethova Fausta. Nejde o pasáž, kde se konstatuje: "To nejlepší, co umíš, přece nemůžeš říct svým studentům." A možná je štěstí, že exministr Johann Wolfgang Goethe nemusel Fausta psát v XML... ale dosti filosofování, vzhůru k příkladu:

<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 heissem Bemüh'n.</l>
</sp>
Příklad úplně jiného XML (vymyšleného autorem bez předchozí přípravy) může vypadat třebas takto:
<goods dph="20" expire="2013/12/12">
<mass>500 ml</mass>
<excisetax>0.16</excisetax>
<name>Pivo nejmenované značky</name>
<ean>8594003352614</ean>
<case>#73 GLS</case>
<energy> 1750 kJ/l </energy>
<store>dark, cold, dry</store>
</goods>

Jelikož každý tag je povinně párový a jelikož tagy nesmějí být zaklesnuté (<a><b></a></b> - to zaklesnutí a tedy zakázaná formace), HTML-dokument nám (strukturou tagů) určuje stromovou strukturu (což je velice důležité, jelikož to příspívá k jednoduchosti jeho interpretování).

Vidíme tedy, že XML je velmi vágně upravený jazyk, kterým lze popsat prakticky cokoliv. Je tedy jasné, že by byl použitelný například jak pro popis webových stránek, tak třebas pro popis rozsáhlejšího projektu napsaného v nejmenovaném studiu (kde se XML ostatně taktéž používá).

Povšimněme si, pokud interpret jednoho jazyka očmuchává XML určené někomu jinému, nebo ještě lépe XML ve verzi novější, než sám zná (tedy takové, kde se vyskytují jemu neznámé tagy a atributy), může tyto poměrně pohodlně ignorovat.

XHTML

Extensible Hypertext Markup Language je taktéž upravena jedním z doporučení W3 Consortia. Jedná se o pokus XMLizovat HTML. O XML jsme se dozvěděli v minulé sekci a tedy je jasné, že jde o jazyk, který by mohl HTML nahradit, kdyby ovšem HTML nemyslelo spíše na pohodlí uživatele, než na pohodlí interpretu. Ostatně XHTML (verze 1.0) se dnes nezřídka používá k návrhu webových stránek. Pro XHTML platí pravidla pro XML, tedy tagy se nesmějí zaklesávat, jsou povinně párové (případná nepárovost se musí označit). Dále jazyk je case-sensitive a správná velikost tagů a atributů je malá, tedy jména tagů a atributů je třeba psát malými písmeny. Aby toho nebylo málo, hodnoty atributů je třeba dávat do uvozovek vždy (nejen pokud obsahují neabecední znaky). Zajímavé (ač nijak překvapivé) je, že i v XHTML je možné používat CSS.

Resource Description Framework

Většina z nás si jistě položila otázku, jak fungují různé systémy porovnávání cen elektronických obchodů, kam zadáme údaj o zboží, které bychom chtěli a obchody nám přijdou setříděné podle ceny, za kterou toto zboží nabízejí. Anebo dokonce vybereme podle požadavků a vyhledávač nám nabízí různé druhy zboží, ke kterým nám podsouvá údaje o cenách v jednotlivých obchodech (kdy tedy cena může být též kritériem vyhledávání). Toto se pokouší řešit tzv. sémantický web, kdy cílem je, aby počítače rozuměly stránkám.

K sémantickému webu jsou vpodstatě dva přístupy. Jeden je, že budeme zkoušet učit počítače porozumět světu kolem nás, druhý je, že jim údaje předžvýkáme a budeme to vydávat za pokrok umělé inteligence. První systém má výraznou nevýhodu, že není příliš známo, že by fungoval. Druhý systém má taktéž výraznou nevýhodu, že je to tak trochu podvod (tedy místo aby si stroj utvořil názor, my mu řekneme, co si má myslet). RDF, potažmo OWL jsou představiteli toho druhého přístupu.

Mimochodem, abychom zodpověděli otázku položenou v počátku kapitoly, jak webové porovnávače zboží porovnávají: Jednotliví obchodníci dodají XML-soubor v dobře popsaném formátu. Vyhledávač tento soubor naparsuje a je chytrý jak radio. Jak popisující soubor může vypadat, se lze podívat.

RDF je něco trochu jiného, ale námi zmíněná aplikace (popis zboží s různými vlastnostmi) může být dobrou motivací pro jeho popis. Z technického hlediska je vhodné poznamenat, že tento framework není navržen pro lidi, ale pro stroje (tedy se nečeká, že tento soubor bude používán lidmi). Je upraven doporučením W3Consortia.

Jedná se o metajazyk umožňující definovat si vlastní typy dokumentů (podle toho, co potřebujeme) stojící na XML. Jako takový je tedy každý jazyk vycházející z RDF tagovým jazykem (využívajícím XML), kdy nám jednotlivé jmenné prostory (namespacy - SGMLsky posané) říkají, jaké tagy a jaké atributy máme využívat. Aby nebylo třeba řešit kolize, před jména jednotlivých tagů, resp. atributů, klademe dvojtečku a před dvojtečku zapisujeme jméno jmenného prostoru, který tento prvek upravuje. Tedy využíváme několik standardním jmenných prostorů. Zejména xmlns (využíváme k popisu dalších jmenných prostorů, přesněji k odkazům na jejich definici typu dokumentu), rdf (jmenný prostor RDF), rdfs (jmenný prostor RDF Schema, který nám umožňuje definovat specifické třídy či atributy - používáme zejména k popisu podtřídy jiné třídy, tedy k jistému ekvivalentu objektové dědičnosti) a dc (Dublin Core properties - předdefinované atributy popisující dokument jako například Creator, Date, Description, Language, Publisher, Subject nebo Title.

Příklad:

...
<rdf:Description rdf:about="stranka.html">
	<dc:date> 2013-02-18</dc:date>
	<dc:title> Takto pojmenovana stranka </ dc:title>
	...
</rdf:Description>
...
Příklad popisuje stránku jménem stranka.html, přiřazují k ní datum (zřejmě vytvoření) a uvádí titulek stránky.

Příklad:


<?xml version="1.0"?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">

<rdf:Description rdf:about="http://jikos.cz/~perm/html/">
  <dc:title>Výukový materiál</dc:title>
  <dc:description>Studijní materiál pro Tvorbu webových stránek
a Vývoj internetových aplikací.</dc:description>
  <dc:author>Martin Pergel</dc:author>
</rdf:Description>

</rdf:RDF>
V příkladu vidíme RDF popis tohoto výukového materiálu.

Při práci s RDF nám může pomoci RDF-validátor.

Práci s RDF jsme motivovali popisem zboží. Je (obzvláště poslední dobou) poměrně typické, že člověku k jednomu kusu zboží prodávající vnucuje všelijaké příslušenství, anebo si člověk může vybírat z více možností. K tomuto RDF definuje prvek Bag, což je neuspořádaný seznam prvků, ze kterého si lze vybírat, dále podobný prvek Seq, který je oproti Bag uspořádaný a ještě Alt, což je seznam alternativ, tedy možností, z nichž si máme vybrat jednu. Ve všech třech případech se jednotlivé možnosti uvádějí prvkem li. Například pokud se rozhodnete zakoupit si známou pohádku Třetí princ, jistě potěší, pokud si člověk může vybrat, zda chce starou videokazetu (formátu VHS - nebo dokonce ještě dříve zapadlý režim BETA), DVD, Blu-ray anebo zda si chce film stáhnout z webu (třebas po zadání kódu, kterým se ověří, že opravdu zaplatil). Podobně, pokud si například chceme koupit nový telefon již neexistující značky Ericsson, můžeme si chtít vybrat nejen barvu bílou, černou, modrou nebo růžovou, ale také si můžeme chtít přikoupit rozšířenou záruku, sluchátka, náhradní baterii nebo americkou redukci na dobíječku. Pokud bychom chtěli popsat tyto dva výrobky v RDF, udělali bychom to asi nějak takto:

<?xml version="1.0"?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:zbozi="http://naskram.cz/doctypedefinition">

<rdf:Description
rdf:about="http://naskram.cz/3princ">
  <zbozi:nazev>Třetí princ</zbozi:nazev>
  <zbozi:format>
	<rdf:Alt>
	    <rdf:li>VHS</rdf:li>
	    <rdf:li>BETA</rdf:li>
	    <rdf:li>DVD</rdf:li>
	    <rdf:li>Blu-ray</rdf:li>
	    <rdf:li>on-line</rdf:li>
	</rdf:Alt>	
  </zbozi:format>
  <zbozi:cena>
	<rdf:Alt>
	    <rdf:li>100</rdf:li>
	    <rdf:li>200</rdf:li>
	    <rdf:li>70</rdf:li>
	    <rdf:li>500</rdf:li>
	    <rdf:li>69</rdf:li>
	</rdf:Alt>	
  </zbozi:cena>
</rdf:Description>

<rdf:Description
rdf:about="http://naskram.cz/telefon>
  <zbozi:barva>
	<rdf:Alt>
	    <rdf:li>černá</rdf:li>
	    <rdf:li>bílá</rdf:li>
	    <rdf:li>modrá</rdf:li>
	    <rdf:li>růžová</rdf:li>
	    <rdf:li>červená</rdf:li>
	</rdf:Alt>	
  </zbozi:barva>
  <zbozi:prislusenstvi>
	<rdf:Bag>
	    <rdf:li>sluchátka</rdf:li>
	    <rdf:li>baterie</rdf:li>
	    <rdf:li>o týden delší záruka</rdf:li>
	    <rdf:li>americká dobíječka</rdf:li>
	</rdf:Bag>
  </zbozi:prislusenstvi>

</rdf:Description>
.
.
.
</rdf:RDF>

OWL - Web Ontology Language

Jde o jazyk vystavěný nad RDF, tedy opět je napsán v XML. Taktéž je navržen na to, aby byl zpracováván strojem (ne člověkem). Opět jde o součást vize sémantického webu, tedy opět jde o jazyk na zpracování informací na webu. Tentokrát jde o jazyk standardizovaný W3Consortiem.

Norma specifikuje hned tři jazyky, které jsou (v tomto pořadí) navzájem v inkluzi (tedy jazyk následující obsahuje jazyk předchozí): OWL Lite, OWL DL a OWL Full. Vztah OWL a RDF by měl být takový, že OWL je silnější nežli RDF.

OWL taktéž využívá různé namespacy, tentokrát jde zejména o namespacy

Příklady můžete najít jinde.

eXtensible Stylesheet Language Transformation

Jde o další možnost (po zamítnutých HTML-atributech a kaskádových stylech) jak ovlivňovat vzhled dokumentu. XSLT využíváme tak, že ke stránce vyrobíme popis transformací, které se mají provést (v souboru s koncovkou xsl, tento soubor "naincludujeme" pomocí metatagu xml-stylesheet:
<?xml-stylesheet href="soubor.xsl" type="text/xsl"?>
Následně spustíme nějaký XSLT-procesor. Pokud nechceme výše uvedený řádek přímo do formátovaného souboru přidávat (například proto, že chceme styly měnit), obejdeme se bez vkládání souboru, v takovém případě XSLT-procesoru typicky příslušný xsl-soubor předáme jako parametr. Výsledkem je opět soubor (typicky XML) přepsaný podle našich transformací. Některé browsery mají XSLT-procesor již vestavěný (a můžeme jich tedy využít k provádění transformací, tedy není nutné provádět tyto transformace napřed a až jejich výsledek nahrát na server). S výhodou lze využít XSLT na webovém klientu například tehdy, pokud se vlivem jejich použití dokument výrazně nafoukne.

Ačkoliv ovlivňování vzhledu je jedno z typických použití XSLT, lze tyto transformace použít obecně k modifikování XML-souboru. Tedy například pokud bychom měli v XML-dokumentu databázi a chtěli bychom ji převést do jiného formátu (například přejmenovat atributy), můžeme použít XSLT též. Anebo můžeme XSLT nasadit na převod příkladů z kapitoly o RDF do HTML (tedy například vypsat stránku se zbožím našeho fiktivního obchodu). XSLT jsou upraveny doporučením W3Consortia. Příklad:

Na příkladu vidíme zdrojový text, který je v XML, jehož tagy vůbec nepřipomínají HTML. Nasazením transformací se však situace změnila. Soubor vypadá takto:

<?xml version="1.0" encoding="UTF8"?>
<?xml-stylesheet type="text/xsl" href="pokus.xsl"?>
<tabulka>
<radek><bunka>1</bunka>
<bunka>2</bunka>
<bunka>3</bunka>
</radek>
<radek><bunka>4</bunka>
<bunka>5</bunka>
<bunka>6</bunka>
</radek>
<radek><bunka>7</bunka>
<bunka>8</bunka>
<bunka>9</bunka>
</radek>
</tabulka>
Transformace, kterou jsme dosáhli převodu do HTML vypadá asi takto:
<?xml version="1.0" encoding="UTF8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>Tabulka:</h2>
	<xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="tabulka">
  <table border="2">
    <caption>Popiska</caption>
    <xsl:apply-templates/>
  </table>
</xsl:template>

<xsl:template match="radek">
  <tr>
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="bunka">
  <td><xsl:apply-templates/></td>
</xsl:template>

</xsl:stylesheet>

V příkladu vidíme čtyři pravidla (sekce xsl:template). První říká, jak přepsat celý dokument (/). V té jasně vidíme zahájení HTML stejně jako ukončení. Přibližně uprostřed vidíme tag <xsl:apply-templates/>, což má charakter jistého rekurzivního zavolání, tedy říkáme: V tomto místě znovu proveď transformace na náš vnitřek. Na tento vnitřek v námi uvedeném příkladu zafunguje transformace zajímající se o prvek tabulka (protože jsme ji v XML-zdrojáku dali jako hlavní prvek). Tento tag přepíšeme na <table> a </table> a mezi tyto tagy necháme znovu provést transformace. To samé posléze uděláme s řádky a totéž s jednotlivými buňkami.

Toto zdaleka není plný rozsah schopností XSL-transformací. Je možno tvořit cykly, proměnné, vyhodnocovat podmínky a podobně. Tyto podrobnosti je však alespoň prozatím třeba hledat v jiné literatuře (například zde).

Element <xsl:for-each select="popis elementu">...</xsl:for-each>
Tento element umožňuje proběhnout přes všechny prvky daného typu. Prvky nemusejí být přímo v daném místě, je možné jít v hierarchii do hloubky (viz např. w3schools, kde se v příkladu vybírají jen některé položky, které se budou vypisovat do tabulky.

Uvnitř cyklu typicky budeme chtít zjistit údaje o jednotlivých prvcích, přes které cyklíme. K tomu můžeme použít prvek <xsl:value-of select="jmeno prvku"/>. Takto můžeme vypsat obsah daného prvku. Ve zmíněném příkladu jsou do jednotlivých prvků ukládány údaje o kompaktních discích a prvky se jmenují title, artist, country, company, price a year.

Dalším prvkem, který si ukážeme, je <xsl:if test="popis testu">...</xsl:if>. Tento prvek nám umožňuje něco podobného, jako if při programování. Test zadáme jako obsah atributu test. Jako příklad opět použijeme web W3Schools. Test může například porovnávat hodnotu nějakého atributu s konstantou, jak v příkladu vidíme. Syntax podmínek není zcela intuitivní, lze používat například porovnání na nerovnost (větší než, menší než), porovnání na rovnost, lze používat logické operátory and, or a not, ovšem porovnání na nerovnost se dělá použitím operátoru rovnosti a negací příslušného výrazu.

XSLT nám umožňuje mnoho dalších operací, například třídit (<xsl:sort select="podle ceho"/>), což lze použít v cyklu, další prvky je možno samostatně nastudovat například ze zmíněných W3Schools.

Cvičení: Vybavte souvislý příklad Kafomat filtrem dle ceny. Filtrování provozujte pomocí XSLT, případně tabulku vybavte dalšími údaji (například obsah kofeinu) a navrhněte rozhraní, které bude pomocí XSLT zobrazovat jednotlivé sloupečky (s jednotlivými údaji), resp. je bude skrývat.
Cvičení na RDF a OWL*: vyrobte popis nápojů nabízených Kafomatem v RDF či OWL.