Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Obsah Předmluva .............................................................................................................................................................. vi 1. Obecně o systému ............................................................................................................................................... 1 Základní vlastnosti ........................................................................................................................................ 1 Používané soubory ........................................................................................................................................ 1 2. Struktura zdrojového dokumentu ........................................................................................................................ 2 Úvod .............................................................................................................................................................. 2 Údaje o majiteli ............................................................................................................................................. 2 Definice možností smazání ........................................................................................................................... 2 Definice typů filmů ....................................................................................................................................... 3 Seznam kazet a filmů na nich ........................................................................................................................ 4 3. Převod do XHTML ............................................................................................................................................. 7 Použití ............................................................................................................................................................ 7 Popis stylu ..................................................................................................................................................... 7 Základní šablona .................................................................................................................................. 8 Šablona prvni_kazety ........................................................................................................................... 9 Šablony odkazy a odkaz .................................................................................................................... 10 Šablony kazeta a film ......................................................................................................................... 12 Šablony volno a abc_filmy ................................................................................................................ 13 4. Převod do XSL-FO ........................................................................................................................................... 15 Použití .......................................................................................................................................................... 15 Popis stylu ................................................................................................................................................... 15
iii
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Seznam tabulek 3.1. Parametry stylu pro převod do XHTML .......................................................................................................... 7 4.1. Parametry stylu pro převod do XSL-FO ........................................................................................................ 15
iv
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Seznam příkladů 2.1. Zápis údajů o majiteli ....................................................................................................................................... 2 2.2. Standardní definice možností smazání ............................................................................................................ 3 2.3. Standardní definice typů filmů ......................................................................................................................... 3 2.4. Kompletní příklad správného zdrojového souboru .......................................................................................... 4 3.1. Text je odkazem pouze při splnění podmínky ................................................................................................. 8 3.2. Základní šablona stylu ..................................................................................................................................... 9 3.3. Kousky kódu ze šablony prvni_kazety ............................................................................................................ 9 3.4. Kousky kódu ze šablon odkazy a odkaz ........................................................................................................ 10 3.5. Kousky kódu ze šablon kazeta a film ............................................................................................................ 12 3.6. Kousky kódu ze šablon abc_filmy a volno .................................................................................................... 13 4.1. Kousky kódu ze stylu pro XSL-FO ............................................................................................................... 16
v
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Předmluva Tento dokument je dokumentací k systému pro správu videokazet vytvořenému jako zápočtový příklad pro předmět IZI238 – Teorie a praxe značkovacích jazyků [http://badame.vse.cz/izi238/] v zimním semestru roku 2002. Hlavní motivací k jeho vytvoření byla moje snaha osvojit si základy XML a přidružených technologií a vyzkoušet si jejich použití na praktickém příkladu.
vi
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 1. Obecně o systému Základní vlastnosti Celý tento systém slouží ke snadné správě domácí videotéky. Umožňuje udržovat přehled detailních informací o všech videokazetách a samozřejmě také o filmech na nich nahraných. Kromě elementárních údajů jako název filmu, pozice jeho začátku na kazetě a jeho délka jsou to takové údaje jako typ (komedie, sportovní, atd.), jazyk a další (viz kapitolu 2 – „Struktura zdrojového dokumentu“). Kromě údajů o nahraných filmech jsou uchovávána také data o volném místě na kazetách. Různé výstupní dokumenty generované z jediného zdrojového dokumentu umožňují přehledné zobrazení nebo zpracování dat. V současnosti jsou k dispozici styly pro převod do XHTML, které vytvoří podle zadaných parametrů sadu XHTML stránek, dále styl pro převod do XSL-FO pro vytištěné výstupy a zkušební verze stylu, který vytvoří MySQL-Dump použitelný k importu dat do databáze. Kromě jednoduchého převodu do zobrazitelné podoby dovolují styly pro XHTML a XSL-FO také vygenerovat abecední seznam filmů a přehled volného místa řazený podle délky. Najít jakýkoliv film z videotéky je potom velice snadné, stejně jako najít vhodnou kazetu s prázdným místem požadované délky.
Používané soubory Vše je tvořeno následujícími soubory: •
video.xml – zdrojový XML dokument s údaji o videokazetách a filmech
•
video.rng – Relax NG schéma na kontrolu struktury a obsahu zdrojového dokumentu
•
video.xsl – XSLT styl na převod dokumentu do několika XHTML stran
•
video.css – kaskádové styly připojené k vygenerovaným XHTML dokumentům
•
video-fo.xsl – XSLT styl na převod dokumentu do XSL-FO pro tištěný výstup
•
ico/ – adresář se základními obrázky používanými ve vygenerovaných dokumentech
•
video-sql.xsl – zkušební verze XSLT stylu pro převod dokumentu na MySQL-Dump pro import dat do
databáze
1
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 2. dokumentu
Struktura
zdrojového
Úvod Veškeré údaje o kazetách se nacházejí v jednom zdrojovém XML dokumentu (video.xml). Jeho struktura je definována pomocí Relax NG [http://www.oasis-open.org/committees/relax-ng/] schématu v souboru video. rng. To, jestli má zdrojový dokument správnou strukturu a odpovídá tomuto schématu, lze zjistit například pomocí validátoru Jing [http://www.thaiopensource.com/relaxng/jing.html] takto: jing video.rng video.xml
Kořenovým elementem zdrojového dokumentu je element video. Hned prvním vnořeným elementem je datum, který udává datum poslední aktualizace. Datum je ve formátu YYYY-MM-DD. Zbytek zdrojového dokumentu je možné rozdělit na čtyři části – údaje o majiteli videotéky (viz „Údaje o majiteli“), definici úrovní „smazatelnosti“ filmů (viz „Definice možností smazání“), definici typů filmů (viz „Definice typů filmů“) a konečně samotný seznam kazet a filmů na nich (viz „Seznam kazet a filmů na nich“).
Údaje o majiteli Celá tato část je nepovinná. Pokud ji chcete uvést použijte v elementu majitel povinné elementy jmeno a prijmeni. Dále můžete použít (v daném pořadí) volitelné elementy email a icq. Význam všech elementů je zřejmý z jejich názvu a příkladu 2.1.
Příklad 2.1. Zápis údajů o majiteli <majitel> <jmeno>Michal <prijmeni>Hauzírek <email>[email protected]34015714
Definice možností smazání U každého nahraného filmu je nožné nastavit jak moc „důležitý“ je (myšleno za jakých okolností se může přehrát něčím jiným). Má to smysl zejména při případném zpracování dat pomocí aplikace, která dynamicky vyhledává souvislé volné místo. Ta může přijímat jako parametr, filmy s jakou úrovní „smazatelnosti“ má ještě považovat za volné místo. Protože takové hodnocení je poměrně subjektivní a každá videotéka může používat vlastní počet i význam stupňů hodnocení, je jejich definice přímo součástí zdrojového dokumentu. Tato část je povinná a musí obsahovat alespoň jednu takovou definici. U každého filmu potom musí být uvedena některá ze zde definovaných hodnot. 1
Samotná definice se provádí v jediném elementu smazatIDs pomocí několika elementů smazatID. Ty mají jeden atribut id, který musí mít jako svou hodnotu malé písmeno s následované přirozeným číslem. Toto číslo je onou hodnotou, kterou případně zpracovává aplikace (například jako volné místo určí filmy s hodnotou větší než 2). Obsahem elementu smazatID je text popisující danou úroveň (může být zobrazen jako titulek nebo ho může používat aplikace k úpravě uživatelského rozhraní). 1 Protože Relax NG v současné době neumožňuje definovat pravidla pro referenční integritu, je tento jednoduchý případ řešený pomocí
datových typů ID a IDREF. Protože je takovýchto referencí použito více druhů (id filmů, typy filmů, „smazatelnost“) , jsou tyto základní datové typy zúženy. Jejich hodnoty musejí odpovídat šabloně x[0-9]+ (kde x je konkrétní malé písmeno např. f pro jedinečné identifikátory filmů, s pro „smazatelnost“a t pro typ filmu).
2
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 2. Struktura zdrojového dokumentu Při generování statických dokumentů (zejména převodu do XHTML) je možné tyto údaje použít k zobrazení barevně odlišných ikon u filmů.
Poznámka Standardní ikony obsažené v adresáři ico/prehrat jsou určeny pro situaci kterou znázorňuje příklad 2.2. Pokud zvolíte jako hodnoty jiná čísla, bude nutné nahradit i obrázky ve zmíněném adresáři. 2
Příklad 2.2. Standardní definice možností smazání <smazatIDs> <smazatID id="s1">Nikdy nemazat <smazatID id="s2">Mazat v nouzi <smazatID id="s3">Mazat výjimečně <smazatID id="s5">Na zkouknutí <smazatID id="s7">Volné místo
Definice typů filmů Velice obdobná situace jako při používání „smazatelnosti“ nastává u typů filmů. Každý film má povinně přiřazen jeden z předem definovaných typů. 1 Ty se opět mohou výrazně lišit pro různé uživatele. Co jsou například pro jednoho prostě dva válečné filmy, může druhý rozlišovat na filmy o první a druhé světové válce. Tato část je opět povinná a má velmi obdobnou strukturu jako část pro popis „smazatelnosti“ popsaná výše. Hlavním rozdílem je, že zde musí být v elementu typIDs definovány alespoň dva typy. Prvním je speciální typ určený výslovně pro volné místo. Ten musí mít identifikátor t0 a musí být uveden na prvním místě. Další typy filmů se definují pomocí elementů typID jak je to zřejmé z příkladu 2.3. Hodnoty atributů id musejí začínat písmenem t a pokračovat číslem.
Poznámka Situaci znázorněné v příkladu 2.3 odpovídají také obrázky pro použití v XHTML dokumentech vygenerovaných pomocí standardního stylu. Jsou umístěny v adresáři ico/typy. Pokud se rozhodnete pro vlastní odlišné varianty, bude nutné nahradit i obrázky ve zmíněném adresáři. 2
Příklad 2.3. Standardní definice typů filmů Volné místoNeurčenoAkčníKomedieKrimiDokumentCartoonHistorickýHorrorHudbaSci-fiSportWesternFilm 2 Obrázky jsou ve formátu GIF s průhledným pozadím a mají velikost 25x25 pixelů. Obrázky pro „smazatelnost“ jsou v adresáři ico/prehrat (obrázek pro typ s1 je 1.gif, pro s2 je 2.gif atd.). Obrázky pro typy filmů jsou v adresáři ico/typy (obrázek pro typ t0 je 0.gif, pro t1 je 1.gif atd.).
3
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 2. Struktura zdrojového dokumentu Home video
Seznam kazet a filmů na nich V poslední (a nejrozsáhlejší) části zdrojového dokumentu se už nachází samotné údaje o tom, jaké kazety ve videotéce jsou a co je na nich nahráno. Také tato část je samozřejmě povinná. Celá je uzavřena v elementu kazety, který obsahuje jednotlivé elementy kazeta. Ty musí povinně obsahovat elementy cislo (číslo kazety) a delka (délka kazety v minutách). Kvůli snadnějšímu zpracování pomocí stylů musí být kazety ve zdrojovém dokumentu seřazeny vzestupně podle čísla. Dále následuje jeden nebo více elementů film s jedinečným atributem id (jeho hodnota musí být písmeno f následované číslem). 1 Dalšími (rovněž povinnými) atributy jsou typ a smazat. První z nich obsahuje jednu z hodnot definovaných dříve v elementu typIDs (viz „Definice typů filmů“). Velmi obdobně druhý atribut odkazuje na jednu z hodnot definovaných v elementu smazatIDs (viz „Definice možností smazání“). Obsahem elementu film jsou další povinné i volitelné elementy, které popisují konkrétní film. K těm povinným patří (v daném pořadí) nazev, zacatek a delka. Element nazev obsahuje nečekaně název filmu :). Element zacatek obsahuje číslo udávající vzdálenost začátku filmu od začátku kazety v minutách standardního nahrávání (SP). 3 Další element delka obsahuje délku filmu v minutách standardního nahrávání (tedy polovina délky pro LP). Tento element má povinný atribut LP, který je buď 1 nebo 0 podle toho jestli je nebo není daný film nahrán v režimu LP. Mezi nepovinné elementy u filmů patří (v daném pořadí) jazyk, titulky, datum a imdbID. Jazyk zvuku ve filmu se zapisuje do elementu jazyk, jazyk případných titulků pak do elementu titulky. Obojí má formát dvoupísmenného kódu jazyka podle ISO 639. Předposlední element datum umožňuje u každého filmu zaznamenat datum, kdy byl nahrán (opět ve formátu YYYY-MM-DD). V elementu imdbID lze filmu přiřadit sedmimístné číslo, které má v internetová databázi filmů The Internet Movie Database [http://www.imdb.com/] (IMDb). Pomocí tohoto čísla je možné při transformaci do XHTML rovnou k jednotlivým filmům dávat odkazy přímo na informace o nich z tohoto zdroje. Vzhledem k tomu, že je pomocí stylů (a případně aplikací) hojně pracováno také s volným místem, je pro snadnější zpracování potřeba aby i volné místo na kazetě bylo ve zdrojovém souboru zaznamenáno jako specifický typ filmu (typu t0). Tuto kapitolu uzavřeme delším příkladem kompletního a funkčního zdrojového souboru.
Příklad 2.4. Kompletní příklad správného zdrojového souboru
6
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 3. Převod do XHTML Použití Standardní XSLT styl pro převod do XHTML generuje sadu provázaných XHTML stránek. Tento styl je určen pro XSLT procesor Saxon [http://saxon.sourceforge.net/] ve verzi 6.5. Chování stylu můžete ovlivnit pomocí několika parametrů. Jejich přehled je uveden v tabulce 3.1. Převod provedete takto: saxon [-o vystup.html] video.xml video.xsl ["parametr1=hodnota1" "parametr2=hodnota2" ...] Jak již bylo uvedeno, lze ovlivnit podobu vygenerovaného výstupu použitím několika parametrů. Je jich celkem osm a jejich základní přehled poskytuje následující tabulka.
Tabulka 3.1. Parametry stylu pro převod do XHTML Parametr
Význam
Výchozí hodnota
stranka
maximální počet kazet na jedné stránce
mazat
zobrazovat ikony pro „smazatelnost“ filmů
0
prazdne
zobrazovat i volné místo na kazetách a prázdné kazety
0
volno
vygenerovat zvlášť seznam volného místa řazený vzestupně podle délky
1
minvolno
minimální délka volného místa v minutách pro zařazení do výše zmiňovaného seznamu
filmy
vygenerovat zvlášť abecední seznam všech filmů
path
cesta k adresáři, kam se mají uložit vygenerované soubory
index
na standardní výstup vygenerovat stránku, která provede automaticky přesměrování na první vygenerovanou stránku se seznamem kazet a
10
15 1 . (aktuální adresář) 1
a Styl zpracovává kazety tak, že podle jejich čísla určí, do kterého souboru patří. Protože kazety s některým číslem mohou chybět, existuje teoretická možnost, že soubor s kazetou s nejnižším číslem bude mít jiný název než 001.html. Proto lze tímto způsobem zajistit (např. uložením výstupu do souboru index.html), že bude prohlížeč vždy přesměrován na „začátek videotéky“.
Poznámka Pokud parametrem určíte jiný cílový adresář, bude nutné do něho zkopírovat adresář s obrázky ico/ a soubor s kaskádovými styly styly.css.
Popis stylu Na začátku stylu jsou definovány parametry popsané v tabulce 3.1 a klíče sloužící k rychlému přiřazování popisků pro typy filmů a „smazatelnost“, dále se určí nejmenší a největší číslo kazety pro další výpočty. 4 Kromě toho je tu definováno záhlaví a zápatí, které je společné pro všechny vygenerované stránky. V záhlaví je použito malého triku k vytvoření hypertextového odkazu. Jde o to, že text se má zobrazit vždy ale má být odkazem jenom za určité podmínky (v tomto případě když je uvedena e-mailová adresa). Celý text i s odkazem je uložen do proměnné. Ta je následně při splnění podmínky zavolána funkcí xsl:copy-of, která vrací hodnotu proměnné včetně značkování. Když podmínka splněna není, volá se proměnná funkcí xsl:value-of, která vrací pouze textový obsah proměnné. Stejný způsob je použit například i při generování lišty s odkazy na další stránky, kdy odkaz na aktuální stránku nemá být aktivní. Vše ilustruje příklad 3.1 4 Kazety ve zdrojovém souboru jsou seřazeny vzestupně podle čísla takže to není moc složité, ale přesto se to musí udělat s ohledem na
parametr prazdne. Tedy vzít v úvahu, že když nechceme pracovat s prázdným místem, musíme úplně ignorovat prázdné kazety (ty které obsahují pouze filmy typu t0).
7
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Tento kus kódu se stará o správné vygenerování jména majitele v záhlaví i s případným odkazem na jeho emailovou adresu pokud je uvedena. Pokud bude ve zdrojovém souboru například toto <majitel> <jmeno>Michal <prijmeni>Hauzírek <email>[email protected]
vygeneruje styl následující kus kódu. Majitel: Michal Hauzírek
Kdyby e-mailová adresa nebyla uvedena, výstupem bude Majitel: Michal Hauzírek
Zbytek stylu si popíšeme po jednotlivých šablonách, které slouží ke konkrétním účelům a postupně se na různé části zdrojového dokumentu volají.
Základní šablona Jádrem celého stylu je jediný element xsl:template který má atribut match. (pokud nepočítáme další dva méně významné s atributem match – jeden pro generování „přesměrovávacího“ výstupu a druhý pro zamezení automatickému vypisování obsahu elementů). Tento atribut má hodnotu kazety. Nejprve je zkontrolováno, jestli parametr stranka není menší než 2. Potom je pro každý element kazeta volána šablona prvni_kazety s parametrem prev. Ten udává číslo stránky, na kterou patřila předchozí kazeta. Každá kazeta je totiž na stránku umisťována podle svého čísla. Z tohoto čísla se dá při znalosti parametru stranka jistit, na kterou stránku patří bez ohledu na celkový počet kazet a případné „díry“ v číslování. To je důležité zejména pro pozdější tvorbu odkazů na kazety, kdy musí být jasné, na kterou stránku se máme odkazovat. Číslo stránky na kterou patří kazeta se vypočítá takto (aktuálním uzlem je kazeta): floor((number(cislo)-1) div $stranka) +1 Kde $stranka je parametr definovaný na začátku stylu. Pokud bude tento parametr například 10, kazety s číslem 1-10 budou na první stránce (soubor 001.html), kazety s číslem 11-20 na druhé stránce (soubor 002.html) atd. Když bude tento parametr 15, na třetí stránce budou kazety s čísly v rozmezí 31-45. Tím starost této šablony o vypsání seznamu kazet končí. Nakonec už jenom zjistí, jestli jsou parametry volno a filmy nastaveny na jedničku a v tom případě se zavolají šablony volno a abc_filmy pro vygenerování seznamu
8
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 3. Převod do XHTML
volného místa a abecedního seznamu filmů. O všechno další se postará šablona prvni_kazety a další jí volané šablony. Kompletní výpis kódu této základní šablony je uveden v příkladu 3.2.
Příklad 3.2. Základní šablona stylu <xsl:template match="kazety"> <xsl:if test="$stranka < 2"> <xsl:message terminate="yes">parametr stranka musi byt vetsi nez 1 <xsl:for-each select="kazeta"> <xsl:call-template name="prvni_kazety"> <xsl:with-param name="prev"> <xsl:value-of select="(floor((number(preceding-sibling::kazeta[1]/cislo)-1) div $stranka) +1)"/> <xsl:if test="$volno=1"> <xsl:call-template name="volno"/> <xsl:if test="$filmy=1"> <xsl:call-template name="abc_filmy"/>
Šablona prvni_kazety Tato šablona má za úkol hlavně najít kazety, které podle čísla patří na novou stránku, tuto novou stránku vytvořit a zpracovat všechny další kazety, které na ní patří. Že kazeta patří na novou stránku se pozná podle toho, že číslo stránky na kterou patří je větší než číslo stránky na kterou patřila předchozí kazeta (kazety jsou ve zdrojovém souboru seřazeny vzestupně). V takovém případě šablona vytvoří novou stránku a zapíše do ní standardní záhlaví. Zavolá další šablonu odkazy, která se postará o vložení lišty s odkazy na ostatní soubory. Jako další krok je volána šablona kazeta pro aktuální kazetu (tu první na stránce). Dál se uloží do proměnné aktuální číslo stránky (aby se při dalším průchodu neměnilo s kontextem) a potom se prochází a následně opět šablonou kazeta zpracují všechny následující (případně pouze neprázdné) kazety, které patří na stejnou stránku (jejich číslo je nejvýše rovno číslu aktuální stránky krát počtu kazet na stránku). Dolů je opět vložena ještě jedna lišta s odkazy na další soubory a vše je zakončeno vložením zápatí. Zajímavé části z kódu šablony prvni_kazety jsou uvedeny v příkladu 3.3.
Příklad 3.3. Kousky kódu ze šablony prvni_kazety <xsl:if test="self::kazeta/cislo=$minimum or $prev < (floor((number(cislo)-1) div $stranka) +1)">
testování, jestli kazeta patří na novou stránku href="{$path}/{format-number((floor( (number(self::kazeta/cislo)-1) div $stranka) +1),'000')}.html" atribut href určující cestu k nově vytvářenému souboru
<xsl:variable name="soubor"> <xsl:value-of select="floor((number(cislo)-1) div $stranka +1)"/> <xsl:choose> <xsl:when test="$prazdne=1">
9
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
zpracování následujících kazet na stejné stránce (buď všech nebo jenom neprázdných)
Šablony odkazy a odkaz Šablona odkazy vytváří lištu s odkazy, která propojuje jednotlivé soubory. Tato lišta se skládá z několika odkazů přímo na stránky s videokazetami, dvou šipek pro pohyb dopředu a dozadu a případně ještě odkazů na seznamy volného místa a abecední seznam filmů . Tato šablona je volána s dvěma parametry s trochu podivnými jmény. První se jmenuje ted a jeho hodnotou je číslo poslední stránky, která bude vygenerována. Hodnota tohoto parametru je během rekurzivního volání šablony odkaz (která se stará o vypsání jednotlivých číselných odkazů) postupně snižována. Když dosáhne čísla první generované stránky (typicky 1), zanořování rekurze skončí a postupně se vypíší odkazy na jednotlivé stránky. Druhý parametr má název tenhle. V tom se uchovává číslo aktuální stránky, pro kterou se lišta zrovna generuje. To je využito jednak ke správnému určení cíle odkazů na šipkách dopředu a dozadu, druhak k tomu, aby text představující v liště aktuální stránku nebyl odkazem. Používá se tu stejný trik s xsl:copy-of a xsl:valueof, jaký byl popsán výše a je znázorněn v příkladu 3.1. V textu odkazů jsou čísla určující rozmezí kazet. Pro jednoduchost se to, jestli kazety s hraničním číslem skutečně existují, zjišťuje a opravuje pouze u první a poslední stránky. Tedy odkaz [ 11-20 ] ve skutečnosti může ukazovat na stránku, která obsahuje kazety až od čísla 12 či 13 (protože ty s číslem 11 resp. 12 neexistují nebo jsou prázdné). Ovšem jestli jsou minimální a maximální čísla neprázdných kazet 3 a 25, první odkaz bude mít text např. [ 3-10 ] a poslední [ 21-25 ]. Odkazy na abecední seznam filmů a seznam volného místa jsou tvořeny zvlášť mimo rekurzi. Parametr tenhle pro ně nabývá zvláštních hodnot -1 resp. 0. Výběr zajímavých částí z kódu šablon odkazy a odkaz následuje v příkladu 3.4.
Příklad 3.4. Kousky kódu ze šablon odkazy a odkaz <xsl:param name="levaSipka"> [< <] <xsl:choose> <xsl:when test="$tenhle > (floor($minimum div $stranka)+1) and $tenhle!=0 and $tenhle!=-1"> <xsl:copy-of select="$levaSipka"/> <xsl:otherwise> <xsl:value-of select="$levaSipka"/>
Výpis levé šipky, která je odkazem doleva, když je kam doleva jít <xsl:call-template name="odkaz">
10
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Pokud se má generovat seznam volného místa vypíše text „[volno]“. Když se zrovna generuje lišta s odkazy pro jiný soubor než právě seznam volného místa, bude ten text i odkazem.
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 3. Převod do XHTML
Stanovení textu odkazů na stránky s videokazetami (s kontrolou minima a maxima) a jejich vypsání jako odkazů jestliže by neodkazovaly na aktuální soubor
Šablony kazeta a film Šablona kazeta vytvoří po svém zavolání tabulku, která obsahuje číslo kazety spolu s návěštím (to slouží jako cíl pro odkazy na jednotlivé kazety) a vnořené tabulky pro filmy. Ty vytváří šablona film, která je volána buď pro všechny filmy, nebo jenom pro „neprázdné“ v závislosti na hodnotě parametru prazdne. V šabloně film se vytvoří vnořená tabulka a nastaví se jí příslušná hodnota atributu class, která je u volného místa odlišná. Následně se vloží ikonka typu filmu a případně i „smazatelnosti“. K obrázkům se pomocí volání funkce key s příslušnými parametry (jméno klíče a jeho požadovaná hodnota – kód typu filmu resp. smazatelnosti) jako alternativní text a titulek přidají popisy získané z příslušného elementu typID resp. smazatID. Vypíše se samozřejmě i název filmu a k němu se poznamenají případné další údaje – že je nahrán na LP, titulky a jazyk když je jiný než český. V dalším sloupci se generuje čas začátku filmu. Počet minut se převede na hodiny a minuty. Ještě předtím se ale čas upraví tak, že se k němu přičte délka všech filmů na stejné kazetě nahraných před aktuálním filmem v systému LP. Tím se dosáhne toho, že údaj o začátku filmu bude souhlasit s údajem, který ukazuje video na displeji (viz také 3). Předposledním údajem je délka filmu. Z výše zmiňovaných důvodů se délka filmů nahraných na LP zapisuje do zdrojového souboru v poloviční délce. K výpočtu skutečné délky je použito malého triku, který využívá toho, že se informace zda je film v tomto režimu nahrán, zapisuje hodnotami 0 resp. 1 atributu LP elementu delka. Skutečná délka se pak vypočítá na jednom řádku tímto výrazem. delka*(delka/@LP+1) V úplně posledním sloupci tabulky filmu je pro filmy, které mají záznam v internetové databázi filmů, vygenerován odkaz na tento záznam v podobě ikonky s logem IMDb. Zajímavé úryvky kódu z těchto dvou šablon jsou opět uvedeny v příkladu 3.5.
Příklad 3.5. Kousky kódu ze šablon kazeta a film <xsl:choose> <xsl:when test="$prazdne=1"> <xsl:for-each select="film"> <xsl:call-template name="film"/> <xsl:otherwise> <xsl:for-each select="film[@typ!='t0']"> <xsl:call-template name="film"/>
Volání šablony film pro všechny nebo jenom „neprázdné“ filmy
Antenna House XSL Formatter (Evaluation) http://www.antennahouse.com
Kapitola 3. Převod do XHTML
<xsl:attribute name="class"> film-table-normal Volba hodnoty atributu class podle toho, jestli se jedná o volné místo
<xsl:variable name="tID"><xsl:value-of select="@typ"/> Vložení ikony typu filmu společně s příslušným popisem získaným z elementu typID získaný pomocí funkce key...
<xsl:key name = "key_typ" match = "/video/typIDs/typID" use = "@id"/>
... a definování tohoto klíče na začátku souboru <xsl:variable name="posun"> <xsl:value-of select="sum(preceding-sibling::film/delka[@LP=1])"/> <xsl:value-of select="floor(number(zacatek+$posun) div 60)"/> : <xsl:value-of select="format-number(number(zacatek+$posun) mod 60,'00')"/>
Výpočet času začátku a jeho převedení na hodiny a minuty <xsl:value-of select="floor(number(delka*(delka/@LP+1)) div 60)"/> : <xsl:value-of select="format-number(number(delka*(delka/@LP+1)) mod 60,'00')"/>
Výpočet délky filmu a její převedení na hodiny a minuty
Šablony volno a abc_filmy V těchto šablonách už není mnoho nového, obě většinou využívají výše zmíněných konstrukcí a obratů. Starají se, jak je z názvu patrné, o vygenerování souborů se seznamem volného místa a abecedním seznamem filmů. Obě opět nejprve vypíší společné záhlaví včetně lišty odkazů. Potom následuje vypsání tabulek příslušnými údaji. V závěru se vypíše společné zápatí. U seznamu volného místa se vypíše každé volné místo (film typu t0), které má minimálně tolik minut, jako je nastaveno v parametru minvolno. Kromě délky se vypisuje také to, kde na kazetě začíná (podobně jako začátek u filmů) a na které kazetě se nachází (včetně odkazu na ni). Volné místo je seřazeno vzestupně podle délky. V abecedním seznamu filmů se kromě názvu filmu (případně jazyka a titulků) vypisuje také jeho začátek na kazetě a číslo kazety s odkazem na ni. V příkladu 3.6 jsou opět některá zajímavá místa z těchto šablon.
Příklad 3.6. Kousky kódu ze šablon abc_filmy a volno <xsl:for-each select="/video/kazety/kazeta/film[@typ='t0' and delka >= $minvolno]"> <xsl:sort select="delka" data-type="number"/> <xsl:sort select="parent::kazeta/cislo" data-type="number"/>
Výběr odpovídajícího volného místa a jeho seřazení podle délky (a potom podle čísla kazety)