ZÁKLADY XML - sspbrno.cz
Transkript
ZÁKLADY XML - sspbrno.cz
ZÁKLADY XML JMENNÉ PROSTORY o při spojení XML dat z různých zdrojů může dojít ke konfliktu v názvech elementů a atributů jmenné prostory o elementy mohu přidělit k různým jmenným prostorům, a tak je rozliším o jmenný prostor musíme deklarovat v souboru XML o deklarujeme ho v počáteční značce elementu pomocí předpony xmlns o kniha a cd jsou pak předponami jmenného prostoru <clanek xmlns:kniha=”http://www.moje_stranka.cz/knihy" xmlns:cd=”http://www.moje_stranka.cz/cd"> o deklarace jm.p. jmenný prostor je identifikován pomocí URI proto, že je tak zaručena globální jedinečnost jm.p. o pak bude vnořený element elementu <clanek> jednoznačně určen jménem (předponou a lokální částí), např. <kniha:autor> a <cd:autor> o předponu lze použít už v elementu, kde je jm.p. deklarován <knihy:clanek xmlns:kniha=”http://www.moje_stranka.cz/knihy"> o mohu také deklarovat defaultní jmenný prostor: <clanek xmlns=”http://www.moje_stranka.cz/knihy"> defaultní jm.p. o všechny vnořené elementy bez předpony pak patří tomuto jmennému prostoru o defaultní jmenný prostor mohu přepsat předponou jiného jmenného prostoru o předpona se automaticky nevztahuje na atributy, těm musím předponu explicitně přidat o předpona xml: je definována specifikací XML o do dokumentu XML můžeme vkládat elementy HTML, ty pak začínají předponou html: <html:IMG xmlns:html=”http://www.w3c.org/TR/REC-html40/" SRC="Raven.bmp"> html: o pokud chceme takto nazvané elementy stylovat pomocí CSS, musíme uvést celý název elementu ve tvaru: kniha\:autor { font-size: 10pt; } 1 css a jm.p. XSLT ZOBRAZENÍ XML POMOCÍ STYLU XSLT o XSLT = Extensible Stylesheet Language Transformations o je spojen se styly, říká, jak data zobrazovat o transformuje XML na HTML o umožňuje data vybírat, upravovat, řadit, mít podmínky i cykly o styly pomocí CSS souborů o je aplikací XML o do XML souboru přidáme hned za deklaraci odkaz na XSLT soubor, pomocí něhož chceme xml soubor zpracovávat: <?xml version="1.0" encoding="windows-1250"?> <?xml-stylesheet type="text/xsl" href="knihy.xsl"?> odkaz v XML ... instrukce pro zpracování xml dokumenti o soubor XSLT (knihy.xsl) musí začínat (podobně jako XML dokument): <?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> soubor XSLT <stylesheet> // obsah </xsl:stylesheet> o kořenovým elementem musí být stylesheet, xsl: deklaruje jmenný prostor XPath o XML soubor má stromovou strukturu s hranami a uzly o XPath ... jazyk pro pohyb ve stromové struktuře, vrací uzly odpovídající danému kritériu o je 7 typů uzlů, uzlem je kořenový uzel, elementy, atributy, komentáře, jmenné prostory, instrukce pro zpracování, text XPath o / kořenový uzel (celý dokument XML = instrukce zpracování, komentář, kořenový element) * uzel typu element . aktuální uzel o jako textový uzel jsou brána i "bílá místa": mezery, konec řádku, posun řádku, tabulátor potomci <stylesheet> přímí potomci elementu <xsl:stylesheet> <xsl:attribute-set> <xsl:decimal-format> <xsl:import> <xsl:include> <xsl:key> <xsl:namespace-alias> <xsl:output> <xsl:param> <xsl:preserve-space> <xsl:strip-space> <xsl:template> ... nejpoužívanějším elementem <xsl:variable> <xsl:script> 2 <xsl:template> ŠABLONY <xsl:template> o určují výsledek celé transformace o odpovídají určitému uzlu nebo skupině uzlů zdrojového dokumentu o šablona říká prohlížeči, jak zobrazit XML pomocí instrukcí pro transformaci komponent XML o atributy šablony: • match ... jméno elementu, na nějž se aplikují příkazy uvnitř šablony • name ... uchovává jméno šablony pro další použití • priority ... určuje pořadí, když lze použít více šablon • mode ... pro skupinu uzlů a instrukci <xsl:apply-templates> budou použity jen šablony se stejnou hodnotou mode <xsl:template match="lokace"> použití šablony // tělo šablony </xsl:template> o atributy šablony tělo šablony v těle šablon mohou být: • • • data typu PCDATA • instrukce XSLT <xsl:apply-imports> <xsl:apply-templates> <xsl:attribute> <xsl:call-templates> <xsl:choose> <xsl:comment> <xsl:copy> <xsl:copy-of> <xsl:element> <xsl:fallback> <xsl:for-each> <xsl:if> <xsl:message> <xsl:number> <xsl:processing-instruction> <xsl:text> <xsl:value-of> <xsl:variable> rozšiřovací elementy - definovány uživatelem nebo procesorem XCLT doslovné elementy - není ani instrukcí XSL ani rozšiřovacím elementem, kopírují se bez jakékoliv změny 3 instrukce XSLT INSTRUKCE <xsl:apply-templates/> o umožňuje rekurzivní aplikování šablony, hledá rekurzivně další vnořené šablony a vypíše jejich obsah <apply-templates> o nepovinný atribut select ... označuje jméno uzlu, který má být zpracován, jinak jsou zpracovány všechny následující uzly <xsl:apply-templates select="prvek"/> knihy.xml <?xml version="1.0" encoding="windows-1250"?> <?xml-stylesheet type="text/xsl" href="knihy.xsl"?> <seznam> <kniha> <nazev>Povídky z jedné kapsy</nazev> <autor>Karel Čapek</autor> <nakladatelstvi>Melantrich</nakladatelstvi> <naklad jednotka="tis.">100</naklad> <rok zeme="(CZ)">1968</rok> </kniha> <kniha> <nazev>Světová revoluce</nazev> <autor>Tomáš G. Masaryk</autor> <nakladatelstvi>Orbis</nakladatelstvi> <naklad jednotka="tis.">50</naklad> <rok zeme="(CZ)">1925</rok> </kniha> <kniha> <nazev>The Feynman lectures on physics</nazev> <autor>Richard Feynman</autor> <nakladatelstvi>Addison-Wesley publishing Company</nakladatelstvi> <naklad jednotka="tis.">20</naklad> <rok zeme="(USA)">1966</rok> </kniha> <kniha> <nazev>Java pro zelenáče</nazev> <autor>Miroslav Virius</autor> <nakladatelstvi>Neocortex</nakladatelstvi> <naklad jednotka="tis.">10</naklad> <rok zeme="(CZ)">2005</rok> </kniha> </seznam> 1. příklad: knihy.xml knihy.xsl <?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head></head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> </xsl:stylesheet> knihy.xsl 4 Prohlížeč začíná aplikovat šablonu (rekurzivně) na kořenový uzel XML (nebo nějaký další uzel): 1. hledá šablonu definující styl, který odpovídá uzlu aplikace šablony 2. pokud najde odpovídající šablonu, vykoná instrukce obsažené v šabloně (spustí transformaci uzlu šablony) 3. pokud nenajde, použije vhodnou vestavěnou šablonu = šablona definovaná specifikací XSLT vestavěné šablony vestavěná šablona pro kořenový uzel XSLT aplikuje šablonu pro všechny potomky kořenového uzlu (pro každý uzel potomka provede kroky 1. -3.) pro uzel element aplikuje šablonu pro všechny potomky uzlu (pro každý uzel potomka provede kroky 1. -3.) pro uzel text zobrazí text, pro uzel atribut zobrazí hodnotu atributu, atribut není potomkem uzlu element pro uzel komentáře neudělá nic Pro náš případ se začne aplikovat šablona pro kořenová uzel, hledá šablony pro potomky uzlů a pak zase pro jejich potomky, nic nenajde, až dojde k textu, ten vypíše: Povídky z jedné kapsyKarel ČapekMelantrich1001968Světová revoluceTomáš G. MasarykOrbis501925The Feynman lectures on physicsRichard FeynmanAddison-Wesley publishing Company201966Java pro zelenáčeMiroslav ViriusNeocortex102005 zobrazení 1.příkladu <value-of> INSTRUKCE <xsl:value-of select="prvek"/> o text obsažený v daném uzlu vloží na výstup HTML, ten text zobrazí o zobrazí i znaková data potomků knihy.xsl <?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/seznam"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="kniha"> <p> <xsl:value-of select="autor"/> <xsl:value-of select="nazev"/> </p> </xsl:template> </xsl:stylesheet> 5 2. příklad: knihy.xsl 1. 2. 3. pro uzel <seznam> začne aplikovat šablonu, hledá šablony pro uzly potomků zpracování šablony najde šablonu pro uzel-element <kniha> šablona říká, že se má do odstavce vypsat text elementů <autor> a <název > zobrazení v prohlížeči: zobrazení 2.příkladu Karel ČapekPovídky z jedné kapsy Tomáš G. MasarykSvětová revoluce Richard FeynmanThe Feynman lectures on physics Miroslav ViriusJava pro zelenáče 3. příklad: knihy.xsl Mohu se také pokusit o zobrazení dat v tabulce: <xsl:template match="/seznam"> <html> <head> <title>Seznam knih</title> </head> <body> <h1>Seznam knih</h1> <table border="1"> <tr> <th>Název</th> <th>Autor</th> <th>Nakladatelství</th> <th>Náklad</th> <th>Rok</th> </tr> <xsl:apply-templates/> </table> </body> </html> </xsl:template> <xsl:template match="kniha"> <tr> <td><xsl:value-of select="nazev"/></td> <td><xsl:value-of select="autor"/></td> <td><xsl:value-of select="nakladatelstvi"/></td> <td><xsl:value-of select="naklad"/></td> <td><xsl:value-of select="rok"/></td> </tr> </xsl:template> zobrazení 3.příkladu Seznam knih Název Autor Nakladatelství Povídky z jedné kapsy Karel Čapek Světová revoluce Tomáš G. Masaryk Orbis Rok 100 1968 50 1925 The Feynman lectures on physics Richard Feynman Addison-Wesley 20 publishing Company 1966 Java pro zelenáče Neocortex 2005 Miroslav Virius Melantrich Náklad 6 10 Pokud budeme chtít vypsat i hodnoty atributů, můžeme použít instrukci: <xsl:apply-templates select="element"/> zobrazení atributů Vytvoříme pak pro dané elementy vlastní šablony: <xsl:template match="element"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@jednotka"/> </xsl:template> šablona pro atribut // šablona pro element // data aktuálního uzlu // zobrazení mezery // výpis hodnoty atributu se jménem jednotka clanek.xsl- doplnění: <xsl:template match="kniha"> <tr> <td><xsl:value-of select="nazev"/></td> <td><xsl:value-of select="autor"/></td> <td><xsl:value-of select="nakladatelstvi"/></td> <td><xsl:apply-templates select="naklad"/></td> <td><xsl:apply-templates select="rok"/></td> </tr> </xsl:template> 4. příklad: knihy.xsl <xsl:template match="naklad"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@jednotka"/> </xsl:template> <xsl:template match="rok"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@zeme"/> </xsl:template> o o u elementů nazev, autor a nakladatelstvi budeme uz jenom vypisovat obsah, proto použijeme instrukci <xsl:value-of select="nazev"/> u elementů naklad a rok chceme vypsat i hodnotu atributu, proto užijeme instrukci <xsl:apply-templates select="rok"/> a napíšeme pro ně vlastní šablonu Název Autor Nakladatelství Náklad Rok Povídky z jedné kapsy Karel Čapek Melantrich 100 tis. 1968 (CZ) Světová revoluce Tomáš G. Masaryk Orbis 50 tis. 1925 (CZ) The Feynman lectures on physics Richard Feynman Addison-Wesley 20 tis. publishing Company 1966 (USA) Java pro zelenáče Miroslav Virius Neocortex 2005 (CZ) 7 10 tis. zobrazení 4. příkladu INSTRUKCE <xsl:text> o <text> s její pomocí můžeme vložit text INSTRUKCE <xsl:for-each> o s její pomocí můžeme cyklicky procházet tělo šablony: <for-each> <xsl:for-each select="kniha"> <p> <xsl:value-of select="nazev"/> </p> </xsl:for-each> INSTRUKCE <xsl:copy-of> o o o kopírování ze zdrojového uzlu do výstupního stromu kopie obsahuje i atributy a potomky vhodné pro kopii z jednoho XML do druhého <copy> <copy-of> <xsl:template match="/"> <xsl:copy> <xsl:copy-of select="*"/> </xsl:copy> </xsl:template> o <if> INSTRUKCE <xsl:if> podobně jako v programovacích jazycích <xsl:template match="kniha"> <xsl:if test="naklad>10"> <p><xsl:value-of select="nazev"/></p> </xsl:if> </xsl:template> predikáty PREDIKÁTY = výsledek posouzení o můžeme zjistit hodnotu elementu, atributu, zjistit potomky elementu, ... o pro manipulaci s uzly slouží funkce: last() ... vrací pořadové číslo posledního uzlu position() ... vrací pozici kontextového uzlu count(sada-uzlů) ... vrací počet uzlů id(řetězec ID) ... vrací sadu uzlů name(sada-uzlů) ... vrací sadu uzlů Pomocí position() můžeme vytvořit výčet elementů kniha – číslovaný seznam: <xsl:template match="kniha"> <p> <xsl:value-of select="position()"/> <xsl:text>. </xsl:text> <xsl:value-of select="Nazev"/> </p> </xsl:template> 8 Jedna xml data tak mohu zobrazit vícekrát: <xsl:template match="/seznam"> <html> <head> <title>Seznam knih</title> </head> <body> <h3>Číslovaný seznam knih</h3> <xsl:for-each select="kniha"> <p> <xsl:value-of select="position()"/> <xsl:text>. </xsl:text> <xsl:value-of select="nazev"/> </p> </xsl:for-each> cyklus for-each <h3>Knihy s větším počtem výtisků</h3> <ul><xsl:apply-templates/></ul> </body> </html> </xsl:template> <xsl:template match="kniha"> <xsl:if test="naklad>10"> <li><xsl:value-of select="nazev"/></li> </xsl:if> </xsl:template> <xsl:template match="kniha[autor!='Karel Čapek']"> <li><xsl:value-of select="nazev"/></li> </xsl:template> větvení if šablona jen pro některé hodnoty elementů </xsl:stylesheet> Seznam jako odkaz na záložku – vytvoření atributu: 1. Vložení odkazu na záložku - v kódu to vypadá takto: <a href="#jmeno_zalozky">text odkazu</a> <xsl:for-each select="kapitola"> <a> <xsl:attribute name="href">#o <xsl:value-of select="position()"/> </xsl:attribute> <xsl:value-of select="position()"/><xsl:text>. </xsl:text> <xsl:value-of select="nadpis2"/> </a> </xsl:for-each> 2. Záložka pak může vypadat třeba takto: <a name="jmeno_zalozky"></a> <h2 id="jmeno_zalozky">Nadpis</h2> <span id=" jmeno_zalozky ">nějaká ukázka</span> <h2> <xsl:attribute name="id">o<xsl:value-of select="position()"/> </xsl:attribute> <xsl:value-of select="position()"/><xsl:text>. </xsl:text> <xsl:value-of select="nadpis"/> </h2> 9 vytvoření atributu odkazu na záložku vytvoření atributu – záložky SHRNUTÍ – PŘEHLED ŠABLON A INSTRUKCÍ • kořenový element souboru XSLT <xsl:stylesheet>... </xsl:stylesheet> atributy: o id ... (nepovinný) o version ... (povinný) ... obvykle "1.0" o xmlns ... xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ... určení jmenného prostoru • šablona XSL pro určitý uzel nebo skupinu uzlů <xsl:template> ... </xsl:template> atributy: o match ... (nepovinný) ..."lokace" uzlu o name ... (nepovinný) ... uchovává název šablony pro další její volání o priority ... (nepovinný) ... číslo určující pořadí šablony o mode ... (nepovinný Pokud není element v těle šablony instrukcí nebo rozšiřovacím elementem, bude doslovně zkopírován do výsledku • těla šablon – instrukce XSLT <xsl:apply-templates /> vyhledá patřičný uzel a nahradí ho obsahem šablony atributy: o select ... (nepovinný) ... označuje jméno uzlu, který má být zpracován, jinak jsou zpracovány všechny následující uzly hledá rekurzivně další vnořené šablony, když je nenajde, vypíše pouze obsah elem. <xsl:value-of /> text obsažený v daném uzlu vloží na výstup HTML, ten text zobrazí atributy: o select ... (nepovinný) ... označuje jméno uzlu, který má být zpracován <xsl:text> ... </xsl:text> vkládání doslovného textu <xsl:attribute> ... </xsl:attribute> vytvoření atributu atributy: o name ... (povinný) ... jméno atributu <xsl:for-each> ... </xsl:for-each> atributy: o select ... (nepovinný) ... označuje jméno uzlu, který má být zpracován 10