• Nebyly nalezeny žádné výsledky

Prˇizpu˚sobenı´ TMAPI pro XSLT

V TMAPI jsou definova´ny trˇi oblasti pro pra´ci s mapami te´mat – core, index a exceptions. Graficka´ podoba TMAPI rozhranı´ je v prˇı´loze 1. Protozˇe XSLT nenabı´zı´ mozˇnost, jak efektivneˇ pracovat s vy´jimkami vyvolany´mi po neˇjake´

chybeˇ (tedy proble´m nasta´va´ u vsˇeho, co je obsazˇeno v exceptions), nebude nic z te´to cˇa´sti implementova´no. Programa´tor vyuzˇı´vajı´cı´ rozhranı´ se tak bude muset sa´m postarat o to, aby hodnoty prˇeda´vane´ funkcı´m a tedy i to, co funkce vracı´, meˇly spra´vny´ typ. Jinak by XSLT transformace mohla skoncˇit necˇekanou chybou7.

4Oxygen XML Editor –http://www.oxygenxml.com/

5Saxon –http://saxon.sourceforge.net/

6TMAPI-XSLT –http://sourceforge.net/projects/xslttmapi

7Prˇi ladeˇnı´ jsem meˇl mozˇnost se o tom mnohokra´t prˇesveˇdcˇit.

KAPITOLA 5. PRˇI´PRAVA. . . 5.2. PRˇIZPU˚ SOBENI´ TMAPI PRO. . .

Dalsˇı´ dveˇ oblasti (coreaindex) pro pra´ci s mapami implementova´ny budou.

I zde se samozrˇejmeˇ bude muset ledacos upravovat. Odpadne naprˇı´klad cˇa´st rozhranı´TopicMapObject, ktera´ by se meˇla starat o nacˇı´ta´nı´ mapy te´mat – to se automaticky provede spusˇteˇnı´m XSLT procesoru s odkazem na zpracova´va-nou mapu. Je prˇitom jedno, zda je mapa ulozˇena na disku nebo uchova´va´na v pameˇti. To umozˇnˇuje prˇeva´deˇt i takove´ mapy te´mat, ktere´ vznikly za beˇhu programu naprˇı´klad sloucˇenı´m vı´ce ru˚zny´ch map.

Zahrnuta nebude ani cˇa´st rozhranı´ Locator, ktera´ se ma´ norma´lneˇ starat o zjisˇteˇnı´ typu odkazu˚. Vzhledem k tomu, zˇe v XTM se pro odkazova´nı´ te´meˇrˇ vy´hradneˇ pouzˇı´va´ jednoduchy´ XLink, nebude ani pro potrˇeby te´to pra´ce po-cˇı´ta´no s odkazy v jine´m forma´tu. Vznikl by navı´c proble´m jak takovy´ forma´t zpracovat8. URI odkazy majı´ take´ tu vy´hodu, zˇe vedou na beˇzˇneˇ zpracovatelne´

zdroje a je tak naprˇı´klad mozˇne´ nacˇı´st odkazovanou externı´ mapu te´mat a zpracovat v nı´ ulozˇena´ te´mata.

Protozˇe TMAPI je zameˇrˇen objektoveˇ a XSLT funkciona´lneˇ, je mimo jine´

nutno na´vrh upravit tak, aby se prˇidal kontext, ve ktere´m se funkce majı´ pro-va´deˇt. To, po kra´tke´ u´vaze, bude ucˇineˇno prˇida´nı´m parametru (promeˇnne´) urcˇujı´cı´m objekt, nad ktery´m se ma´ funkce prove´st. Parametr v tomto prˇı´padeˇ mu˚zˇe by´t cokoliv od rˇeteˇzce azˇ po element cˇi cely´ dokument.

Jednou z vyuzˇity´ch promeˇnny´ch pro urcˇenı´ kontextu, kterou bude mı´t mnoho implementovany´ch funkcı´, je samotna´ mapa te´mat ve forma´tu XTM, se kterou ma´ funkce pracovat. Te´ je potrˇeba naprˇı´klad u funkcı´ vracejı´cı´ch se-znamy (v TMAPI oblast index), metod hledajı´cı´ch podle zadane´ho rˇeteˇzce a mnoha dalsˇı´ch. Bude tak cˇa´stecˇneˇ ignorova´na mozˇnost XSLT prova´deˇt XPath dotazy prˇı´mo nad dokumentem prˇedany´m jako parametr prˇi spusˇteˇnı´ transfor-mace a funkce se budou prova´deˇt nad mapou prˇedanou jako parametr. Tento prˇı´stup ma´ zajı´mavou vy´hodu – prˇi zpracova´nı´ mapy odkazovane´ z aktua´lnı´ho souboru bude bez modifikace mozˇne´ vyuzˇı´t stejnou sadu funkcı´.

Vy´beˇr funkcı´ vhodny´ch pro implementaci probı´hal postupny´m procha´-zenı´m metod TMAPI dle dokumentace a zkouma´nı´m, zda je dana´ metoda implementovatelna´ a zda ma´ v XSLT rozumne´ vyuzˇitı´ (tedy aby nebyla im-plementovana´ jen proto, aby byla imim-plementovana´ a nebyla prˇitom k nicˇemu uzˇitecˇna´). Po skoncˇenı´ tohoto vy´beˇru byla vytvorˇena graficka´ dokumentace, viz obra´zky7.a8., ve ktere´ je seznam vsˇech implementovany´ch funkcı´. Pro veˇtsˇı´

srovnatelnost s TMAPI byla tato dokumentace take´ zna´zorneˇna v objektove´m prostrˇedı´.

Na´zvy teˇchto funkcı´ byly opraveny jizˇ zmı´neˇny´m zpu˚sobem tak, zˇe bylo odstraneˇno pocˇa´tecˇnı´geta neˇktere´ funkce byly sloucˇene´ do jedne´, aby nedocha´-zelo ke kolizı´m v na´zvech. Tı´m, zˇe je TMAPI objektove´, prova´dı´ se jednotlive´

metody nad konkre´tnı´m objektem a nenı´ tak proble´m, kdyzˇ se metody ve vı´ce trˇı´da´ch jmenujı´ stejneˇ. To vsˇak v XSLT nenı´ mozˇne´ a jsou dveˇ mozˇnosti, jak tuto situaci vyrˇesˇit. Prvnı´ mozˇnostı´ je prˇejmenovat proble´move´ funkce tak, aby se odstranil konflikt. Typicky´m za´stupcem je funkce getValuerespektivevalue,

8To je asi take´ du˚vod, procˇ se v XTM 2.0 bude pro odkazy vyuzˇı´vat HREF, tedy stejny´

KAPITOLA 5. PRˇI´PRAVA. . . 5.2. PRˇIZPU˚ SOBENI´ TMAPI PRO. . .

Obra´zek 7.TMAPI-XSLT index

ktera´ je definova´na pro vı´ce trˇı´d – tu by bylo mozˇne´ prˇejmenovat naprˇı´klad na baseNameValuenebo occurrenceValue. Druhou mozˇnostı´ je zapracovat takovou funkcionalitu, aby funkce vracely spra´vne´ hodnoty pro ru˚zne´ elementy.

XSLT je nasˇteˇstı´ navrzˇeno tak, zˇe nenı´ proble´m stejnou funkci pouzˇı´t na ru˚zne´ elementy a dostat prˇitom spra´vny´ vy´sledek. V prˇı´padeˇ jizˇ zminˇovane´

funkce value, je tak stejna´ funkce pouzˇitelna´ na elementy Occurrence, Variant a TopicName – o tom jaka´ je struktura jednotlivy´ch elementu˚, jste se mohli dozveˇdeˇt v prˇedchozı´ cˇa´sti pra´ce. Funkce jednou vracı´ hodnotu z elementu resourceDataa podruhe´ zbaseNameString, v zˇa´dne´m prˇı´padeˇ vsˇak nemu˚zˇe dojı´t k za´meˇneˇ a navra´cenı´ sˇpatne´ho vy´sledku.

Kapitola 6

Implementace funkcı´

Implementace jednotlivy´ch funkcı´ probı´hala postupneˇ a ihned probı´halo testo-va´nı´, zda jsou vraceny spra´vne´ hodnoty. Brzy se uka´zalo, zˇe u´vodnı´ na´vrh nebyl zcela dokonaly´ a bylo zapotrˇebı´ dodatecˇneˇ udeˇlat urcˇite´ zmeˇny, ktere´ budou popsa´ny v na´sledujı´cı´ch odstavcı´ch. Da´le zde bude uveden popis neˇktery´ch funkcı´ a vy´pis ko´du teˇch zajı´mavy´ch. Jeho struktura je na´sledujı´cı´: na prvnı´m rˇa´dku je jme´no funkce v pu˚vodnı´m TMAPI rozhranı´ a cˇa´st, do ktere´ patrˇı´ (index nebo core). Pak na´sleduje samotna´ XSLT implementace, vcˇetneˇ uka´zek ko´du, neˇkde u´cˇelneˇ zkra´cena´. Kompletnı´ zdrojovy´ ko´d je v prˇı´loze, na prˇidane´m CD nebo na stra´nka´ch projektu vytvorˇene´m v souvislosti s touto pracı´.

Beˇhem implementace bylo zajı´mave´ sledovat, jak se urcˇite´ cˇa´sti ko´du cˇasto opakujı´. Uka´zalo se tak, zˇe je vhodne´ vytvorˇit neˇkolik spolecˇny´ch funkcı´, ktere´

by byly vyuzˇı´va´ny ostatnı´mi funkcemi. Jedna´ se o funkce, ktere´ jsou specificke´

pro implementaci v XSLT, nejsou tedy ani soucˇa´stı´ TMAPI rozhranı´. Neˇktere´

z nich jsou mysˇleny jako skryte´ pro uzˇivatele rozhranı´ a nemeˇly by proto by´t vola´ny jinak nezˇ jinou implementovanou funkcı´.

Po vytvorˇenı´ teˇchto spolecˇny´ch funkcı´ bylo mozˇne´ prˇistoupit k vytvorˇenı´

dalsˇı´ch, starajı´cı´ch se o zı´ska´va´nı´ dat z map te´mat. Tyto funkce jizˇ mohou by´t vola´ny programa´tory, vyuzˇı´vajı´cı´mi toto rozhranı´. Veˇtsˇina funkcı´ je prˇe-kvapiveˇ pomeˇrneˇ kra´tka´. To prokazuje sı´lu, jakou ma´ spojenı´ XSLT s XPath.

Vzhledem k tomu, zˇe neˇktere´ cˇa´sti XTM forma´tu jsou prakticky stejne´ jako jine´

a tedy i implementovane´ funkce majı´ podobnou strukturu, nebudou vypsa´ny vsˇechny zdrojove´ ko´dy, ale pouze ty, ktere´ jsou v neˇcˇem zajı´mave´ nebo jine´ nezˇ prˇedchozı´.

<?xml version=”1.0” encoding=”UTF-8”?>

<xsl:stylesheet

xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”

version=”2.0”

xmlns:tm=”http://xslttmapi.sf.net”

xmlns:xs=”http://www.w3.org/2001/XMLSchema”

xmlns:xtm=”http://www.topicmaps.org/xtm/1.0/”

xmlns:xlink=”http://www.w3.org/1999/xlink”

KAPITOLA 6. IMPLEMENTACE. . .

extension-element-prefixes=”xs xsl tm”

>

Pro vytva´rˇene´ funkce byl zvolen spolecˇny´ prefixtm: s fiktivnı´m jmenny´m prostorem (neˇjaky´ prefix uzˇivatelsky´ch funkcı´ je v XSLT povinny´). Pak je v XSL definova´no neˇkolik dalsˇı´ch jmenny´ch prostoru˚, ktere´ jsou pro implementaci potrˇebne´. Zaprve´ je to xmlns:xs, ktery´ umozˇnˇuje pouzˇı´t typy promeˇnny´ch vy-uzˇitelne´ v XML sche´matech. Zadruhe´ xmlns:xtm, ktery´ se odkazuje na vlastnı´

standard map te´mat. Jako poslednı´ je zapsa´n jmenny´ prostor XLink, aby bylo mozˇno pracovat s odkazy.

Obra´zek 8. XSLT TMAPI core – jak by na´vrh mohl vypadat kdyby XSLT bylo objektove´

Kapitoly popisujı´cı´ jednotlive´ funkce jsou rozdeˇleny na trˇi cˇa´sti, podle funkcionality (rozdeˇlenı´ se inspirovalo u TMAPI). Nejdrˇı´ve budou popsa´ny za´kladnı´ funkce, z nichzˇ jedna slouzˇı´ pro kontrolu spra´vnosti forma´tu doku-mentu, a dalsˇı´ jsou (jizˇ zmı´neˇne´) podpu˚rne´ pro ostatnı´ funkce – tedy naprˇı´klad

KAPITOLA 6. IMPLEMENTACE. . . 6.1. SPOLECˇNE´ FUNKCE – CHECK

funkce pro vyhodnocenı´ odkazu˚. Pote´ na´sleduje popis funkcı´ vytva´rˇejı´cı´ch se-znamy podle ru˚zny´ch vlastnostı´ – mimo jine´ seznam vsˇech te´mat vyuzˇity´ch pro popis rozsahu (scope), seznam te´mat vyuzˇity´ch jako typy atd. Nakonec budou popsa´ny funkce umozˇnˇujı´cı´ pra´ci s jednotlivy´mi elementy – zjisˇt’ujı´cı´

naprˇı´klad jme´no te´matu, rozsah pu˚sobnosti objektu atd.

6.1 Spolecˇne´ funkce – check

Funkcecheck, ktera´ ve stejne´ podobeˇ v TMAPI nenı´, by se meˇla volat na pra´veˇ zpracova´vanou mapu te´mat vzˇdy jako prvnı´. Provede totizˇ za´kladnı´ kontrolu forma´tu dokumentu a v prˇı´padeˇ, zˇe neˇco nenı´ v porˇa´dku, umozˇnˇuje ukon-cˇit zpracova´nı´ sˇablony drˇı´v, nezˇ dojde k neˇjake´ neprˇedvı´datelne´ chybeˇ. Tato funkce kontroluje, zda je v XTM dokumentu pouzˇit spra´vny´ jmenny´ prostor, zda je v dokumentu na nejvysˇsˇı´ u´rovni element topicMap a zda neobsahuje nepodporovany´ elementmergeMap.

<!-- Check for known syntax - mergeMap and namespace -->

<xsl:function name=”tm:check” as=”xs:string”>

<xsl:param name=”p_tmf” as=”document-node()”/>

<xsl:variable name=”test1” select=”if (count

($p_tmf/xtm:topicMap)=0) then ’1’ else ’0’” />

<xsl:variable name=”test2” select=”if (count

($p_tmf//xtm:mergeMap)!=0) then ’2’ else ’0’” />

<xsl:value-of select=”concat($test1,$test2)” />

</xsl:function>

Jako vstupnı´ parametr se funkci prˇeda´va´ cela´ mapa te´mat a na vy´stup se zapisuje vy´sledek typu rˇeteˇzec. V prˇı´padeˇ, zˇe je vsˇe v porˇa´dku obsahuje same´

nuly. Kontrola se provede XPath vy´razem pro spocˇı´ta´nı´ elementu˚. Aby byl XTM dokument oznacˇen jako bezvadny´, musı´ obsahovat pra´veˇ jeden element topicMapna nejvysˇsˇı´ u´rovni ve spra´vne´m jmenne´m prostoru a nesmı´ obsahovat zˇa´dny´ element po slucˇova´nı´ mapmergeMap, tedy celkovy´ pocˇet jeho vy´skytu se musı´ rovnat nule. Kontrola spra´vnosti jmenne´ho prostoru zjisˇt’uje, zda je dokument opravdu ve forma´tu XTM 1.0. Takovy´ XML dokument by meˇl mı´t v hlavicˇce nastavenoxmlns:xtm=”http://www.topicmaps.org/xtm/1.0/”.

Je pravdeˇpodobne´, zˇe po neˇjake´m vy´razneˇ veˇtsˇı´m testova´nı´ na rea´lny´ch datech, by se prˇisˇlo na potrˇebu jesˇteˇ dalsˇı´ch kontrol. Tato implementace byla zkousˇena pouze na neˇkolika desı´tka´ch verˇejneˇ dostupny´ch map te´mat. Jake´ko-liv dalsˇı´ kontroly pak stacˇı´ implementovat do funkce check. Budoucı´ rozsˇı´rˇenı´

by bylo mozˇne´ naprˇı´klad o detekci, zda je XTM soubor ve verzi 1.01 nebo 2.0. Bylo by pak mozˇne´ vytvorˇit rozskok programu a stejna´ sˇablona by byla pouzˇitelna´ na obeˇ verze forma´tu.

1Prˇı´padneˇ by se dala funkce rozsˇı´rˇit i o detekci nikdy oficia´lneˇ nevydane´ verze XTM 1.1. Ta

KAPITOLA 6. IMPLEMENTACE. . . 6.2. SPOLECˇNE´ FUNKCE –. . .