Transcript XML - XSLT

Extensible Markup Language
XSLT
transzformációk
Hernyák Zoltán
http://aries.ektf.hu/~hz
[email protected]
XML - XSLT
Extensible Style Sheet Language Transformation
XSLT
Ez egy ”programozási nyelv”
XML-ben van a forráskód 
feldolgoz egy XML filet
eredménye egy újabb HTML, CSS, XLS, XML file
XML - XSLT
Kell egy „futtató” program hozzá (xslt feldolgozó)
- Xalan (Java alapú)
http://www.apache.org
- Saxon (C# alapú)
http://saxon.sourceforge.net/
transform.exe -xsl:person_templ.xls -s:person.xml
-s:<forrás> az adatokat tartalmató xml file
-xsl:<program> az xslt transzformációs program
A program ”outputja” a transzformáció eredménye
XML névterek
Az XML elemeket névterekbe lehet rakni
Több XML esetén az azonos nevű elemeket így lehet
egymástól elkülöníteni
Egy XML-en belül is hasznos, ha azonos nevű elemeknek
más-más lehetséges tartalmi leírást adunk
Első lépés: definiálni kell a névteret
Második lépés: használni kell a névteret
<java xmlns:java=”http://www.sun.com/java”
xmlns:delphi=”http://www.borland.com/delphi”>
….
<delphi:integer name=”a” value=”12” />
<java:integer name=”x” value=”34” />
</java>
XML - XSLT
<people>
<person>
<name>Jane Doe</name>
<pet>Fluffy</pet>
</person>
</people>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
I found a person element!
</xsl:template>
</xsl:stylesheet>
Az XSLT processor az xls névtér elemeit dolgozza fel
XML - XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
….
</xsl:stylesheet>
Az XSLT file ezzel kezdődik
Innen ismeri majd fel a feldolgozó program mire számítson
XML - XSLT
<xsl:template match="person">
I found a person element!
</xsl:template>
Egy vagy több template van benne
Egy ilyen template tartalma kiíródik, ha az XML file
beolvasása közben egyezést talál a feldolgozó
Template-k nem egymásba ágyazhatóak!
XML - XSLT
<people>
<person>
<name>Jane Doe</name>
<pet>Fluffy</pet>
</person>
</people>
Ebben a formában az applytemplates kiírja a tag-ekhez
tartozó értékeket
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
---- person ----<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
XML - XSLT
<xsl:template match="person">
-- A Person -<xsl:apply-templates />
</xsl:template>
<xsl:template match="name">
Name: <xsl:apply-templates />
</xsl:template>
<xsl:template match="pet">
Pet: <xsl:apply-templates />
</xsl:template>
XML - XSLT
<?xml version="1.0"?>
<xsl:stylesheet … >
<xsl:output method=”text” />
<xsl:strip-space elements=”name pet” />
…
</xsl:stylesheet>
Output-method = text -> nem írja ki az xml fejlécet
Output-method = html ->html kimenetet produkál
Output-method = xml -> XML kimenetet produkál
strip-space: a felsorolt elemek között
eltávolítja a white-space-eket
preserve-space: … megtartja a white space-eket (def.)
XML - XSLT
Készítsünk ilyet!
XML - XSLT
XML - XSLT
Meg kell írni a template-t az elemekre
XML - XSLT
Az apply-templates feldolgozza a közbeeső elemeket
<body> … </body> -t ki lehet írni
XHTML kötelező (a tag-eket le is kell zárni!)
XML - XSLT
HTML tagokat tudunk beépíteni az outputba
a megfelelő helyre
XML - XPATH
Leíró technika, elemeket azonosít egy XML-en belül
A gyökér elemet / jel szimbolizálja
/people/person/name
- minden „name” elemet kiválaszt a
/people/person-n belül
XML – XPATH szabályok
nodename
- minden elem kiválasztása, akinek a szülője az adott
nevű node
/
- kiindulás a gyökérelemből
//
- kiválasztja az aktuális elemből kiinduló minden
elemet, bármely mélységbe
.
aktuális elem kiválasztása
..
szülő elem kiválasztása
@
attribútum-kiválasztás
XML - XPATH
person
- minden elem kiválasztása, akinek a szülője „person”
/people/person/name
- minden „name” elemet kiválaszt a
/people/person-n belül
person//name
- minden name kiválasztása, akinek a szülője „person”
//name
- minden „name” elemet kiválaszt az XML-en belül
//pet/@breed
- a pet elemek breed attribútumai
//@*
- minden attribútumot kiválaszt
//@species
- minden species attribútumot kiválaszt
XML - XPATH
Mivel gyakori, hogy egy Xpath útvonal több elemet
is kiválaszt, de ezekből csak egy kell – prédikátumok
kellenek a további azonosításhoz…
//person[1]
- az első találat
//person[last()]
- utolsó találat
//person[last()-1]
- utolsó előtti találat
//pet[.=‘Fluffy’]
. szimbolizálja az aktuális elemet
kiválasztja azokat az elemeket,
amelyeknek az értéke ‘Fluffy’
//pet[.=‘Fluffy’]/..
kiválasztja a szülő elemét, a ‘Fluffy’ értékű node-nak
//name[contains(.,’Jane’)]
minden „name” elemet, amelyben szerepel „Jane”
XML - XPATH
//pet[@breed]
- az összes pet elem, amelynek van breed attr-a
//pet[@breed=‘collie’]
- az összes pet elem, amelynek van breed-ke
amelynek értéke „collie”
//pet[@breed=‘collie’]/..
a szülő elemek, amelyeknek van collie breed-jük
//pet[@species=‘cat’] | //pet[@species=’dog’]
az elemek melyek vagy cat-ok vagy dog-ok
XML - XSLT
<xsl:template match=”/people/person">
--- PEOPLE –
<xsl:apply-templates />
</xsl:template>
A match is egy XPATH leírás
Ezen találat csak a fenti útvonalon talált person-okra
illeszkedik rá
<xsl:template match=”/">
<html>
<body>
<xls:apply-templates />
</body>
</html>
</xsl:template>
Gyökér elemre illeszkedő template
XML - XSLT
<xsl:template match=”//name[@address]">
Name: <xsl:apply-templates /> (with address)
</xsl:template>
<xsl:template match=”name">
Name: <xsl:apply-templates />
</xsl:template>
Ha van neki „address” property-je, akkor felső
szabály szerint íródik ki,
Ha nincs neki, akkor az alsó
A sorrend nem számít az xsl-en belül
XML - XSLT
<xsl:template match=”//name[@address]">
Name: <xsl:apply-templates /> (with address)
</xsl:template>
<xsl:template match=”name">
Name: <xsl:apply-templates />
</xsl:template>
Ha van neki „address” property-je, akkor felső
szabály szerint íródik ki,
Ha nincs neki, akkor az alsó
A sorrend nem számít az xsl-en belül
XML – XSLT tengelyek
ancestor
minden ős (felfelé rekúrzívan)
ancestor-or-self
saját maga és minden őse
attribute
az aktuális node összes attribútuma
child
az aktuális node összes gyerek node-ja
descendant
minden gyerek node (lefelé rekúrzívan)
XML – XSLT tengelyek
following
az aktuális node bezáró tagja után _minden_
following-sibling
az akt.node után következő minden testvér
namespace
az akt.node minden névtér node -ja
parent
az őse az akt.node-nak
preceding
a megelőző tartalom (akt.node előtti tartalom)
preceding-sibling
node előtti összes testvér
self
saját maga
XML – XSLT tengelyek
child::book
minden „book” ami gyerekeleme az akt.node-nak
child::*
az akt.node minden gyerekeleme
descendant::book
az akt.node alatt bárhol szereplő „book”-k
ancestor::book
felettünk bárhol szereplő „book”-k
child::*/child::price
2 szinttel alattunk lévő „price” elemek
//pet[@breed=’calico’]/parent::*
minden pet element, amelynek
van „breed” attribútuma, amely „calico” értékű
XML - XSLT
Elem értékének lekérése: value-of
Az aktuális node alatti gyerek elemek közül a name
értéke
<xsl:value-of select=”name” />
Az aktuális node „breed” attribútumának értéke
<xsl:value-of select=”@breed” />
XML - XSLT
XSLT transzformációban alkalmazni a value-of -t
<xsl:template match="pet">
<b>Pet: </b> <xsl:apply-templates /><br />
Species: <xsl:value-of select="@species" /><br />
Breed: <xsl:value-of select="@breed" /><br />
</xsl:template>
XML - XSLT
@*
name()
minden attribútum kiválasztása
megadja az attribútum nevét
<xsl:template match="@*">
<xsl:value-of select="name()" /> :
<xsl:value-of select="." /><br />
</xsl:template>
XML - XSLT
Feltételes output készítése
<xsl:if test=”… kifejezés …” />
… szöveg kiiírás …
</xls:if>
<xsl:if test=”@species=‘cat’” />
<img src=”cat.gif” /><br>
</xls:if>
XML - XSLT
Feltételes output készítése
<xsl:if test=”@species=‘cat’” />
<img src=”cat.gif” /><br>
</xls:if>
XML - XSLT
Készítsünk el egy DVD nyilvántartó XML filet. Egy DVD-t
jellemez a címe, kiadás éve, ára. A DVD kategóriáját
adjuk meg attribútum formájában (akció|zene|rajzfilm).
Ezen XML file alapján készítsünk el egy HTML outputot,
ahol a DVD címe legyen pirossal írva, ha az akciófilm,
egy DVD film információi egy sorba kerüljenek.
Készítsünk el egy CSV kimenetet is, vesszővel tagolt
text file, melyet Excelben be lehet olvasni.