230 likes | 437 Views
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.
E N D
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 Textový jazyk, k vymezení logických částí (prvků) se používají následující značky (tagy): • <prvek atribut1= ”hodnota1” atribut2=”hodnota2” … > • … obsah prvku ... • </prvek> Zkrácený zápis - pokud je obsah prvku prázdný <prvek… atributy …/> Speciální znaky < … < ,> … > ,& … & ," … ” , ' … ’ ,   … znak s číslem 160 v Unicode (zde tvrdá mezera)
Stromová reprezentace XML dokument: Odpovídající strom: <dokument> <odstavec sirka=“50“> bla bla bla </odstavec> <odstavec> ble ble </odstavec> </dokument> dokument text(‘\n‘) odstavec( @sirka = 50 ) text(‘\n bla bla bla\n‘) odstavec text(‘\n ble ble\n‘) text(‘\n‘)
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 • * - libovolný prvek VýrazA/Bse chápe jako „B je synem A“ VýrazA//Bse 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)
Příklady Xpath (1) • /dokument dokument text(‘\n‘) • /dokument/odstavec odstavec( @sirka = 50 ) • /dokument/text() text(‘\n bla bla bla\n‘) odstavec • /text() text(‘\n ble ble\n‘) • //odstavec text(‘\n‘)
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]. • je-li i záporné, počíta se od konce • A[ podmínka]- takové A, že splňuje danou podmínku. • a[@href=”neco.html”] - dotaz na hodnotu atributu • 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) • //odstavec[1] dokument text(‘\n‘) • //text()[-2] odstavec( @sirka = 50 ) • //odstavec[@sirka=50] text(‘\n bla bla bla\n‘) odstavec • //text()[position() = last()] text(‘\n ble ble\n‘) • //text()[position() mod 2 = 1] text(‘\n‘)
Princip XSLT XML xml2html.xsl HTML další XML WML xml2wml.xsl
Jak funguje XSLT procesor Transformací uzlu budeme rozumět proces, při němž: • Vybereme vyhovující šablonu • 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.
Formát XSLT souboru XSLT je instancí XML, tj. jedná se o XML soubory, ale XSLT jim dává význam <?xml version=”1.0”?> <xsl:stylesheet version=”1.0” xmlns=”http://www.w3.org/1999/XSL/Transform”> … šablony ... </xsl:stylesheet>
Šablony - xsl:template <xsl:template match=”...výraz...”> … příkazy ... </xsl:template> Š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í • <xsl:apply-templates/> 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 <xsl:apply-templates/>
Příklad V XML si budeme uchovávat informace o zaměstnancích - pro začátek jméno a příjmení <zamestnanci> <zamestnanec> <jmeno>Josef</jmeno> <prijmeni>Novak</prijmeni> </zamestnanec> … další zaměstnanci ... </zamestnanci>
První řešení <xsl:stylesheet …… > <xsl:template match=”zamestnanec”> <xsl:apply-templates/> <br/> </xsl:template> </xsl:stylesheet>
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(e-mail 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=”p[2]” - vybere druhý synovský odstavec • select=”/dokument” - vybere prvek dokument, který je kořenem stromu. NEBEZPEČNÉ!
xsl:value-of Vrátí text, který vznikne vynecháním značek v obsahu prvního uzlu, který bude vybrán atributem select • <xsl:value-of select=”.”> - vrátí text z akt. uzlu • <xsl:value-of select=”p”> - vrátí text z 1. synovského odstavce • <xsl:value-of select=”@href”> - vrátí hodnotu atributu href
Vylepšené řešení <xsl:stylesheet …… > <xsl:template match=”zamestnanec”> <xsl:value-of select=”jmeno”/> <xsl:value-of select=”prijmeni”/> <br/> </xsl:template> </xsl:stylesheet>
Změna designu <xsl:stylesheet …… > <xsl:template match=”zamestnanec”> <li> <xsl:value-of select=”jmeno”/> <xsl:value-of select=”prijmeni”/> </li> </xsl:template> <xsl:template match=”zamestnanec”> <ul><xsl:apply-templates/></ul> </xsl:template> </xsl:stylesheet>
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 <xsl:template match="email"> <a> <xsl:attribute name="href"> mailto:<xsl:value-of select="."/> </xsl:attribute> <xsl:value-of select="."/> </a> </xsl:template>
Automatické číslování Výhodné, pokud obsah často měníme - nezapomeneme na to Použijeme funkciposition() <xsl:template ...> <xsl:value-of select=”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 <xsl:template name=“id1“> … obsah … <xsl:template … > <xsl:call-template name=“id1“> ...
Parametry při volání šablon Parametr se deklaruje ve volané šabloně: <xsl:param name=”p1”>implicitní hodnota</xsl:param> Hodnota se specifikuje při volání <xsl:call-template name=”t1”> <xsl:with-param name=”p1”>jiná hodnota</xsl:param> </xsl:call-template> K hodnotě proměnné se dostaneme přes$p1