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 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.
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>
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
owlx
- namespace XMLské prezentační syntaxe
(používáme například k definici jednotlivých prvků),
owl
- jmenný prostor RDFské syntaxe OWL,
xsd
- XML Schema Datatypes - popisuje například jednotlivé
datové typy (používané v rámci owlx při definování prvků).
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.