You are on page 1of 44

D

r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

Tehnologii Web
Un model de date pentru <Web />
partea III: transformari XML (2)






detalii in [TX, 87-102]
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

Faceti ceva si daca nu merge incercati altceva.


Franklin Delano Roosevelt
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

Care este prezentul/viitorul
transformarilor XML?
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0
Recomandare W3C (2007)

Baza pentru XSLT 2.0 si XQuery 1.0



www.w3.org/TR/xpath20/

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Opereaza asupra unei structuri logice (abstracte)
a documentului XML numita data model

www.w3.org/TR/xpath-datamodel/

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Tipurile de date sunt cele specificate
de XML Schema
vezi
cursul viitor

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Traversarea documentelor poate utiliza axe noi

exemple:
following-sibling
preceding-sibling
...

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Secvente ordonate
in loc de seturi de noduri (node-sets)


secventele pot contine duplicate,
dar nu pot fi formate din sub-secvente

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Secvente ordonate
in loc de seturi de noduri (node-sets)

se permite si specificarea intervalelor
(considerate tot secvente)

exemplu: (8, 10, 1 to 4)

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Relativ la secventele de noduri, apar operatorii:

union (|) reuniunea de secvente

intersect intersectia de secvente

except diferenta dintre secvente

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Operatorul idiv ofera un rezultat intreg

Comparatiile generale se pot efectua
via =, !=, <, <=, >, >=,
iar cele asupra valorilor atomice
prin eq, ne, lt, le, gt, respectiv ge

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Pentru iterare de secvente,
se foloseste expresia for

for $i in (10, 20), $j in (1, 2)
return ($i + $j)

(: lista titlurilor proiectelor cu pozitii in intervalul [2, 8] :)
for $poz in (2 to 8)
return /projects/project[$poz]/title

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Expresiile conditionale pot fi exprimate prin if

if (catalog[@stare = 'final'])
then student/nota
else student/prezente

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Se permit expresii cuantificate
precedate de cuantificatorii some ori every

some $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4

every $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Se permit expresii cuantificate
precedate de cuantificatorii some ori every

some $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4

every $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
intoarce true
false

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Pot fi utilizate noi functii descrise in specificatia
http://www.w3.org/TR/xpath-functions/



apartin spatiului de nume fn desemnat de URI-ul:
http://www.w3.org/2005/xpath-functions

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Signatura unei functii este definita prin

fn:nume ($parametru as tip, ...) as tip-returnat

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii cu caracter general

error()

trace()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii privitoare la URI/IRI

iri-to-uri()

encode-for-uri()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii referitoare la siruri de caractere

compare()
upper-case()
lower-case()
ends-with()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii privind secventele de noduri

exists() index-of() empty()
zero-or-one() one-or-more() exactly-one()
subsequence() deep-equal()
reverse() remove()
etc.

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii privind accesul la noduri/document

node-name()
root()
doc()
doc-available()
document-uri()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii referitoare la valori numerice

abs()
avg()
min()
max()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
Functii oferind suport pentru expresii regulate

matches()
replace()
tokenize()

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o


avansat
if (matches ($proiect/title, "^(F|T).*", "mi"))
then $proiect/title else "Titlul proiectului nu incepe cu 'F' sau 'T'."
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: noutati
si multe altele

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xpath 2.0: demo
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0
Recomandare W3C (2007)

http://www.w3.org/TR/xslt20/


se bazeaza pe XPath 2.0

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Parcurgerea grupurilor de noduri
via constructia <xsl:for-each-group>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Document XML ce include date & meta-date despre
piesele muzicale disponibile pe un mediu de stocare:
<USBDeviceLibrary>
<Song Filename="Dead Can Dance - Indus.mp3"
Artist="Dead Can Dance" Album="Spiritchaser" Title="Indus"
Genre="New Age" Year="1996" Track="3" Size="8997682"/>
<Song Filename="Pink Floyd - Mother.mp3" Artist="Pink Floyd"
Album="The Wall" Title="Mother" Genre="Rock" Year="1979"
Track="8" Size="9571309"/>
<Song Filename="Delerium.mp3" Artist="Delerium"
Album="Nuages du Monde" Title="Indoctrination"
Genre="Electronic" Year="2006" Track="4" Size="8731491"/>
<Song Filename="Pink Floyd - High Hopes.mp3" Artist="Pink Floyd"
Album="The Division Bell" Title="High Hopes" Genre="Rock"
Year="1994" Track="11" Size="12241905"/>

</USBDeviceLibrary>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Constructie XSLT 2.0 generand grupuri
conform atributului Artist:

<xsl:for-each-group
select="/USBDeviceLibrary/Song" group-by="@Artist">
<xsl:sort select="@Artist" />
Melodiile formatiei <xsl:value-of select="@Artist"/> sunt:
<!-- Selectam titlul piesei din grupul curent -->
<xsl:value-of select="current-group()/@Title" separator=", " />
* Un total de <xsl:value-of select="count(current-group())"/> piese.
* Spatiu ocupat: <xsl:value-of select=
"format-number(sum(current-group()/@Size) div (1024 * 1024), '00')" />
</xsl:for-each-group>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Rezultatul obtinut in urma efectuarii transformarii:

Melodiile formatiei Dead Can Dance sunt:

Indus, Nierika (live)
* Un total de 2 piese.
* Spatiu ocupat: 15 MB.

Melodiile formatiei Delerium sunt:

Indoctrination
* Un total de 1 piese.
* Spatiu ocupat: 08 MB.

Melodiile formatiei Pink Floyd sunt:

Outside the Wall, Mother, High Hopes, Eclipse
* Un total de 4 piese.
* Spatiu ocupat: 29 MB.

avansat
grupare pe baza
atributului Artist
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Crearea de arbori multipli la iesire
(reprezentari multiple ale transformarilor)

avansat
vezi exemplele
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Specificarea de functii definite de utilizator

<!-- functie ce inverseaza cuvintele dintr-un sir -->
<xsl:function name="tw:inverseaza">
<xsl:param name="sir"/>
<xsl:value-of select="if (contains ($sir, ' ')) then
concat (tw:inverseaza (substring-after ($sir, ' ')), ' ',
substring-before ($sir, ' ')) else $sir" />
</xsl:function>


avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Declaratii de tipuri pentru variabile/parametri

<!-- secventa de siruri de caractere stocata intr-o variabila -->
<xsl:variable name="mesaje" as="xs:string*">
<xsl:sequence select="mesaje/mesaj" />
</xsl:variable>
0, 1 sau mai multe
date de tip string

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
<xsl:for-each> poate procesa orice secventa
de valori nu doar de noduri

<!-- iteram tipurile de punctaje obtinute -->
<xsl:for-each select="('proiect', 'test', 'bonus')">

</xsl:for-each>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Criteriul de sortare poate fi specificat de
o functie specificata de programator





o secventa sortata poate fi generata
via constructia <xsl:perform-sort>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Aparitia de functii noi e.g., formatarea datei

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
Pot fi create noduri de tip spatiu de nume
prin constructia <xsl:namespace>

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: noutati
si multe altele

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: procesoare
Aplicatia de referinta:

Saxon (Java, C#)

http://saxon.sourceforge.net/

avansat
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

xslt 2.0: demo
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

rezumat
Transformari XSL:
de la la XPath 2.0 la XSLT 2.0
D
r
.

S
a
b
i
n

B
u
r
a
g
a

w
w
w
.
p
u
r
l
.
o
r
g
/
n
e
t
/
b
u
s
a
c
o

?

You might also like