Jazyk XML Jazyk pro tvorbu strukturovaných dokumentů Syntaxí velmi podobný HTML Hlavní cíle návrhu: Snadná editace - jazyk je textový Snadné strojové zpracování - jednoduchá syntaxe
Základní syntaxe XML … obsah prvku... Zkrácený zápis - pokud je obsah prvku prázdný Textový jazyk, k vymezení logických částí (prvků) se používají následující značky (tagy): Speciální znaky < …,& … &," … ”, ' … ’, … znak s číslem 160 v Unicode (zde tvrdá mezera)
Stromová reprezentace bla bla bla ble ble dokument text(‘\n‘) = 50 ) text(‘\n bla bla bla\n‘) odstavec text(‘\n ble ble\n‘) text(‘\n‘) XML dokument:Odpovídající strom:
Základy Xpath (1) Výrazy popisující ”cestu” ve stromu Jednotlivé kroky se oddělují lomítky a mohou být: název prvku, např. odstavec text() - odpovídá text(…) v stromu. - odkaz na sebe sama.. - odkaz na otce Výraz A/B se chápe jako „B je synem A“ Výraz A//B se chápe jako „B je potomkem A“ Cesty mohou být absolutní (popisují cestu od kořene, začínají lomítkem) relativní (popisují cestu od pevně zvoleného uzlu, nezačínají lomítkem) * - libovolný prvek
Příklady Xpath (1) dokument text(‘\n‘) = 50 ) text(‘\n bla bla bla\n‘) odstavec text(‘\n ble ble\n‘) text(‘\n‘) /dokument /dokument/odstavec /dokument/text() /text() //odstavec
Základy Xpath(2) Na konci každého kroku se mohou objevit predikáty: A[ i ] - i-tý uzel splňující A, např. text()[2]. A[ podmínka ] - takové A, že splňuje danou podmínku. - dotaz na hodnotu atributu je-li i záporné, počíta se od konce div[title!=”nic”] - dotaz na text prvku tr[position() mod 2=1] - volání spec. fcí. position() - kolikátý uzel to je last() - kolik uzlů celkem existuje count(A) - kolik uzlů vytvoří výraz A
Příklady Xpath(2) dokument text(‘\n‘) = 50 ) text(‘\n bla bla bla\n‘) odstavec text(‘\n ble ble\n‘) text(‘\n‘) //odstavec[1] //text()[-2] //text()[position() = last()] //text()[position() mod 2 = 1]
Princip XSLT XMLxml2html.xsl xml2wml.xsl HTML WML další XML
Jak funguje XSLT procesor Transformací uzlu budeme rozumět proces, při němž: Pokud taková neexistuje, použije se implicitní Vytvoříme nový strom(les) podle příkazů uvnitř a ten vrátíme jako výsledek Transformací dokumentu pak bude transformace kořene stromu dokumentu. Vybereme vyhovující šablonu
Formát XSLT souboru XSLT je instancí XML, tj. jedná se o XML soubory, ale XSLT jim dává význam … šablony...
Šablony - xsl:template … příkazy... Šablona je vyhovující (pro uzel u), pokud: výraz je absolutní cesta a odpovídá uzlu u výraz je relativní cesta a existuje uzel v, tak, že výraz odpovídá relativní cestě z v do uzlu u je-li více kandidátů, vybere se ta, která byla v XSLT napsána jako poslední
Příkazy v šablonách textové uzly se okopírují prvky, které nezačínají na ‘xsl:’, se také okopírují prvky, které začínají na ‘xsl:’, jsou speciální provede transformace synů a vrátí takto získané stromy další uvidíme později Implicitní pravidla textové uzly se okopírují u prvků je chování identické s šablonou s jediným příkazem
Příklad V XML si budeme uchovávat informace o zaměstnancích - pro začátek jméno a příjmení Josef Novak … další zaměstnanci...
První řešení
Problémy Pokud zaměníme pořadí jmena a prijmeni v XML, ovlivní to výstup Pokud mezi jmenem a prijmenim v XML, nebude mezera, jméno a příjmení se slijí Pokud přidáme další položky pro zaměstnance( apod.), přestane to fungovat.
xsl:apply-templates Pokud specifikujeme atribut select, provede se rekurze jen na uzly, které vyhovují cestě uvedené v select. select=”p” - vybere všechny synovské odstavce select=”.//p” - vybere všechny odstavce, které jsou potomky aktuálního uzlu select=”/dokument” - vybere prvek dokument, který je kořenem stromu. NEBEZPEČNÉ! select=”p[2]” - vybere druhý synovský odstavec
xsl:value-of Vrátí text, který vznikne vynecháním značek v obsahu prvního uzlu, který bude vybrán atributem select - vrátí text z akt. uzlu - vrátí text z 1. synovského odstavce - vrátí hodnotu atributu href
Vylepšené řešení
Změna designu
xsl:attribute přidá atribut k prvku, do kterého je vnořen jméno se získá z atributu name, hodnota z obsahu prvku mailto:
Automatické číslování Výhodné, pokud obsah často měníme - nezapomeneme na to Použijeme funkci position() … pokračování...
Volání pojmenovaných šablon Šablonu lze pojmenovat pomocí atributu name - musí být unikátní v dokumentu K volání slouží xsl:call-template … obsah …...
Parametry při volání šablon Parametr se deklaruje ve volané šabloně: implicitní hodnota Hodnota se specifikuje při volání jiná hodnota K hodnotě proměnné se dostaneme přes $p1