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
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 jednoznačně určen jménem (předponou a lokální částí), např. a
o
předponu lze použít už v elementu, kde je jm.p. deklarován
o mohu také deklarovat defaultní jmenný prostor:
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:
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:
odkaz v XML
... instrukce pro zpracování xml dokumenti
o soubor XSLT (knihy.xsl) musí začínat (podobně jako XML dokument): <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
soubor XSLT <stylesheet>
// obsah 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
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
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 <seznam> Povídky z jedné kapsy Karel Čapek Melantrich 100 1968 Světová revoluce Tomáš G. Masaryk Orbis 50 1925 The Feynman lectures on physics Richard Feynman Addison-Wesley publishing Company 20 1966 Java pro zelenáče Miroslav Virius Neocortex 10 2005
1. příklad: knihy.xml
knihy.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates/>
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
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 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/seznam"> <xsl:apply-templates/> <xsl:template match="kniha"> <xsl:value-of select="autor"/> <xsl:value-of select="nazev"/>
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 šablona říká, že se má do odstavce vypsat text elementů a
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"> Seznam knih Seznam knih
Název | Autor | Nakladatelství | Náklad | Rok |
<xsl:apply-templates/>
<xsl:template match="kniha"> <xsl:value-of select="nazev"/> | <xsl:value-of select="autor"/> | <xsl:value-of select="nakladatelstvi"/> | <xsl:value-of select="naklad"/> | <xsl:value-of select="rok"/> |
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:value-of select="@jednotka"/>
š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"> <xsl:value-of select="nazev"/> | <xsl:value-of select="autor"/> | <xsl:value-of select="nakladatelstvi"/> | <xsl:apply-templates select="naklad"/> | <xsl:apply-templates select="rok"/> |
4. příklad: knihy.xsl
<xsl:template match="naklad"> <xsl:value-of select="."/> <xsl:text> <xsl:value-of select="@jednotka"/> <xsl:template match="rok"> <xsl:value-of select="."/> <xsl:text> <xsl:value-of select="@zeme"/> 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
s její pomocí můžeme vložit text INSTRUKCE <xsl:for-each>
o s její pomocí můžeme cyklicky procházet tělo šablony:
<xsl:for-each select="kniha"> <xsl:value-of select="nazev"/>
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
<xsl:template match="/"> <xsl:copy> <xsl:copy-of select="*"/>
o
INSTRUKCE <xsl:if> podobně jako v programovacích jazycích <xsl:template match="kniha"> <xsl:if test="naklad>10"> <xsl:value-of select="nazev"/>
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"> <xsl:value-of select="position()"/> <xsl:text>. <xsl:value-of select="Nazev"/>
8
Jedna xml data tak mohu zobrazit vícekrát: <xsl:template match="/seznam"> Seznam knih Číslovaný seznam knih
<xsl:for-each select="kniha"> <xsl:value-of select="position()"/> <xsl:text>. <xsl:value-of select="nazev"/>
cyklus for-each
Knihy s větším počtem výtisků
<xsl:template match="kniha"> <xsl:if test="naklad>10"> <xsl:value-of select="nazev"/> <xsl:template match="kniha[autor!='Karel Čapek']"> <xsl:value-of select="nazev"/>
větvení if
šablona jen pro některé hodnoty elementů
Seznam jako odkaz na záložku – vytvoření atributu: 1. Vložení odkazu na záložku - v kódu to vypadá takto: text odkazu <xsl:for-each select="kapitola"> <xsl:attribute name="href">#o <xsl:value-of select="position()"/> <xsl:value-of select="position()"/><xsl:text>. <xsl:value-of select="nadpis2"/> 2. Záložka pak může vypadat třeba takto: Nadpis
<span id=" jmeno_zalozky ">nějaká ukázka <xsl:attribute name="id">o<xsl:value-of select="position()"/> <xsl:value-of select="position()"/><xsl:text>. <xsl:value-of select="nadpis"/>
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>... 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> ... 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> ... vkládání doslovného textu <xsl:attribute> ... vytvoření atributu atributy:
o name ... (povinný) ... jméno atributu <xsl:for-each> ... atributy:
o select ... (nepovinný) ... označuje jméno uzlu, který má být zpracován
10