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&gt;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&gt;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