C05. XPath

61
C05. XPath Date Semistructurate, 2012-2013

description

C05. XPath. Date Semistructurate, 2012-2013. C 05 . DS. XPath. C05 - DS. XSL (eXtensible Style Sheet Language) = > XSLT (transformarea documentelor XML), XPath (navigarea in documentele XML), XSL-FO (formatarea documentelor XML). - PowerPoint PPT Presentation

Transcript of C05. XPath

Page 1: C05. XPath

C05. XPath

Date Semistructurate, 2012-2013

Page 2: C05. XPath

C05. DS

• XPath

Page 3: C05. XPath

• XSL (eXtensible Style Sheet Language) => XSLT (transformarea documentelor XML), XPath (navigarea in documentele XML), XSL-FO (formatarea documentelor XML).

• XPath este un limbaj non-XML pentru identificarea unor parti din documente XML, navigarea in documente XML, contine functii pre-definite, important pentru XSLT, XQuery si altele.

• O cale de localizare este o expresie XPath care selecteaza un set de noduri. O expresie XPath poate sa identifice un nod dupa pozitie absoluta, pozitie relativa, tip, continut + alte criterii.

• Observatie: XSLT foloseste expresii XPath pentru a alege elementele din documentul de intrare pentru a le procesa in vederea transformarii pentru documentul de iesire.

C05 - DS

Page 4: C05. XPath

• Exemplu – orientare intr-o localitate– cauti o adresa, ti se spune directia (ajungi intr-o intersectie, o iei la

dreapta, mergi 500m, o iei la stanga etc.)– la fel este si prin structura arborelui de intrare, pe care se aplica o

expresie XPath. In general, directia este data in functie de pozitia curenta – nodul de context.

• De exemplu: expresii care sa refere primul element „person” dintr-un document; al 5-lea element fiu al celui de-al 7-lea element „person”; atributul ID al elementului „person” care are un anumit continut s.a.

C05 - DS

Page 5: C05. XPath

• Modelul de date XPath

• Un document XML este pur si simplu o secventa de caractere, cand exista ca fisier text.

• Un parser XML este capabil, insa, sa proceseze acest continut si, daca este un document well-formed, sa extraga anumiti tokens logici ce reprezinta elemente sau alte parti din document.

• Astfel, parserul XML determina o structura logica si o modeleaza ca noduri XPath.

• XPath modeleaza un document XML ca ierarhie de noduri.• Un procesor”” XPath examineaza ierarhia de noduri pentru a determina

daca o cale de localizare (data printr-o expresie XPath) se potriveste vreunui nod

• => se obtine un rezultat = un set de noduri gol, de unul sau mai multe noduri.

C05 - DS

Page 6: C05. XPath

• Structura arborescenta a unui document XML

• Un document XML este un arbore format din noduri, unde un nod are unul sau mai multe noduri fiu. (La nivel logic, arborele de intrare este format din noduri (nu din elemente, atribute s.a.).) Exista un singur nod radacina, care contine toate nodurile documentului XML. Un document XML este tratat ca arbore de noduri.

• XPath identifica 7 tipuri de noduri:– nodul radacina / nodul document (unul singur pentru un document XML)

(acesta nu este elementul radacina al XML, ci este nod deasupra acestuia)– noduri element (pentru elementele documentului XML, inclusiv elementul

radacina al documentului XML)– noduri text (continut text al unui element)– noduri atribut (pentru un atribut din documentul XML)– noduri comentariu (comentariu in documentul sursa)– noduri pentru instructiuni de procesare– noduri de s.n.

C05 - DS

Page 7: C05. XPath

• Constructiile care nu sunt incluse in aceasta lista sunt: CDATA, referintele de entitati si declaratiile de tip de document.

• XPath opereaza asupra unui document dupa ce aceste constructii au fost rezolvate””. De exemplu, pentru valoarea unui atribut, XPath nu poate sa spuna daca a fost data direct in documentul procesat sau a fost inlocuit cu ajutorul DTD-ului sau XSD-ului (daca exista definita o valoare implicita sau fixa pentru atribut).

• Exemplu:<?xml version="1.0"?><?xml-stylesheet type="application/xml" href="orar.xsl"?><!DOCTYPE orar [ ... <!ATTLIST curs ziua CDATA #FIXED "luni">]><orar> <curs> <!-- + atributul ziua = "luni" --> Date semistructurate &#x50; </curs></orar>

C05 - DS

Page 8: C05. XPath

• Exemplu:<?xml-stylesheet href="people.xsl" type="text/xsl"?><!-- Fisier de cu persoane importante --><people country="Romania"/>

• => acest document are ca si corespondent urmatorul arborele (sursa) in memorie:

• Nodul radacina:– nodul pentru instructiunea de procesare <?xml-stylesheet...>– nodul comentariu– un nod de tip element, pentru „people”

– un nod de tip atribut, pentru „country”

C05 - DS

Page 9: C05. XPath

• Relatii intre noduri

• Parinte & Fii. Un nod poate sa aiba 0, 1 sau mai multi fii; un nod are un singur parinte.

<parinte><fiu1>...</fiu1><fiu2>...</fiu2>

</parinte>

• Vecini / Frati. Noduri care au acelasi parinte.<parinte>

<frate1>...</frate1><frate2>...</frate2>

</parinte>

C05 - DS

Page 10: C05. XPath

• Stramosi / Ascendenti (Ancestors). Pentru un nod – parintele, parintele parintelui, s.a.m.d.

<bunic> <parinte> <fiu1>...</fiu1> <fiu2>...</fiu2> </parinte></bunic>

• Descendenti. Pentru un nod – nodurile fiu, fii acestor noduri s.a.m.d.

<parinte> <fiu> <nepot>...</nepot> </fiu></parinte>

C05 - DS

Page 11: C05. XPath

• Cai de localizare (location paths)

– O expresie XPath des intalnita este calea de localizare = care identifica un set de noduri din document.

– Acest set poate fi gol, poate sa contina un singur nod sau o serie de noduri – care pot sa fie noduri element, atribut, de s.n., text, comentariu, instructiune de procesare, radacina sau (aproape) orice combinatie a acestora.

– O cale de localizare este construita din pasi de localizare succesivi.– Fiecare pas de localizare este evaluat relativ la un anumit nod al

documentului, numit nod de context. Sau – se poate efectua localizare directa a unui set de noduri (prin cale absoluta).

– Observatie: vezi calea de localizare a unui director in arborele de directoare de pe un disc.

C05 - DS

Page 12: C05. XPath

• Cai de localizare XPath

• Pentru descrierea cailor de localizare se pot folosi patru sintaxe XPath:

– cai de localizare absolute ne-abreviate– cai de localizare relative ne-abreviate– cai de localizare absolute abreviate– cai de localizare relative abreviate

C05 - DS

Page 13: C05. XPath

Axe XPath– child axis – copiii nodului de context– descendant axis – descendentii nodului de context– parent axis – parintele nodului de context– ancestor axis – stramosii nodului de context– following-sibling axis – vecinii urmatori nodului curent– preceding-sibling axis – vecinii precedenti nodului curent– following axis – toate nodurile dupa nodul de context, in ordinea in

care apar in document– preceding axis – toate nodurile inainte de nodul de context, in

ordinea in care apar in document– attribute axis – toate nodurile atribut ale nodului de context– namespace axis – nodurile de s.n. pentru nodul de context– self axis – nodul de context– descendant-or-self – nodul de context si descendentii– ancestor-or-self – nodul de context si stramosii

C05 - DS

Page 14: C05. XPath

• Cai de localizare abreviate

C05 - DS

Page 15: C05. XPath

• Exemplu:<people>

<person born="1912" died="1954" id="p342">

<name>

<first_name>Alan</first_name>

<last_name>Turing</last_name>

</name>

<profession>computer scientist</profession>

<profession>mathematician</profession>

<profession>cryptographer</profession>

<homepage hp="http://www.turing.org.uk/"/>

<hobby>Playing the bongoes</hobby> </person>

</people>

C05 - DS

Page 16: C05. XPath

• Calea de localizare pentru radacina

• Cea mai simpla care de localizare este cea care selecteaza nodul radacina al unui document: „/”. Aceasta reprezinta o cale absoluta – indiferent de nodul de context, reprezinta nodul radacina.

• Observatie: Daca o cale de localizare incepe cu „/”, atunci este o cale absoluta (exemplu: /people – selecteaza elementul radacina al documentului XML).

• Observatie: Vezi sintaxa Unix de specificare a cailor de directoare / fisiere. Exemplu: „/” reprezinta directorul radacina.

• Exemplu: transformarea intregului document in document html; atributul match trebuie sa contina o expresie XPath care sa indice peste care set de noduri sa se aplice un template:

<xsl:template match="/"> <html><xsl:apply-templates/></html></xsl:template>

C05 - DS

Page 17: C05. XPath

• Pasi de localizare a elementelor fiu

• O alta cale de localizare simpla este prin specificarea numelui unui element

• Exemplu: se activeaza regula de template pentru elementul „person” la fiecare intalnire a elementului „person”; pe rand, fiecare nod „person” devine nod de context, iar expresia XPath din <xsl:value-of select="name"/> refera un element „name” diferit.

<xsl:template match="people"> <xsl:apply-templates select="person"/></xsl:template><xsl:template match="person"> <xsl:value-of select="name"/></xsl:template>

C05 - DS

Page 18: C05. XPath

• Pasi de localizare pentru atribute

• Pentru a selecta un anumit atribut al unui element, se foloseste @nume_atribut.

• De exemplu: @CNP selecteaza atributul CNP al nodului de context.• Exemplu: generare tabel de persoane plus date (XML + XSLT).

<people> <person born="1912" died="1954" id="p342"> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> </person> <person>...</person> ...</people>

C05 - DS

Page 19: C05. XPath

<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://...">

<xsl:template match="/"> <html> <xsl:apply-templates select="people"/> </html> </xsl:template> <xsl:template match="people"> <table> <xsl:apply-templates select="person"/> </table> </xsl:template> <xsl:template match="person"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="@born"/></td> <td><xsl:value-of select="@died"/></td> </tr> </xsl:template></xsl:stylesheet>

C05 - DS

Page 20: C05. XPath

• Rezultat:

<html> <table> <tr> <td>Alan Turing</td> <td>1912</td> <td>1954</td> </tr> <tr> <td>Richard P Feynman</td> <td>1918</td> <td>1988</td> </tr> </table></html>

C05 - DS

Page 21: C05. XPath

• Pasi de localizare comment() si text()

• Nodurile de comentariu si de text nu au nume => sabloanele „comment()” si „text()” selecteaza orice nod comentariu sau text din nodul de context.

• Fiecare comentariu este considerat un nod de comentariu separat.• Fiecare nod de text contine textul de lungime maxima, contiguu, ne-

intrerupt de vreun tag.

• Observatie: Implicit, un stil XSLT proceseaza nodurile de text, insa nu si nodurile de comentariu (pentru acestea trebuie specificat un template de comentariu).

• Observatie: Comentariile in afara elementului radacina sunt noduri fiu ale nodului radacina al arborelui XML

C05 - DS

Page 22: C05. XPath

• Exemplu: fiecare comentariu este inlocuit cu textul dat, scris italic (intr-un output HTML).

<xsl:template match="comment()">

<i>Here we have a comment</i>

</xsl:template>

Sau

<xsl:template match="person">

<xsl:value-of select="comment()">

</xsl:template>

C05 - DS

Page 23: C05. XPath

• Caracterele de sablon

• * – se potriveste oricarui element (nod de element), indiferent de numele sau.

• Exemplu: (1) fiecare element isi va avea fiii procesati, insa vreo scriere se va face numai daca pentru vreun nod fiu se va specifica un template ((2) – se va afisa italic continutul nodurilor “profession”).

(1)<xsl:template match="*"> <xsl:apply-templates select="*"/></xsl:template>(2)<xsl:template match="profession">

<i>

<xsl:value-of select="."/>

</i>

</xsl:template>

C05 - DS

Page 24: C05. XPath

• Caracterele de sablon

• node() – se potriveste nodurilor de element, de atribut, de text si de comentariu (plus de instructiuni de procesare si de s.n.).

• @* – se potriveste oricarui nod de atribut.

• Exemplu: valorile tuturor atributelor elementelor „person” sunt scrise ca si continut de element <attributes> (intr-un output XML)

<xsl:template match="person"> <attributes> <xsl:apply-templates select="@*"/> </attributes></xsl:template>

C05 - DS

Page 25: C05. XPath

• Potriviri multiple cu „|”

• Pentru a asocia un template mai multor noduri, posibil de diferite tipuri, se pot combina caile si pasii de localizare cu „|”.

• Exemplu: o regula de template care se aplica tuturor nodurilor frunza (first_name, last_name, profession, hobby) care nu sunt goale (li se afiseaza continutul text)

<xsl:template match="first_name|last_name|profession|hobby"> <xsl:value-of select="text()"/>

</xsl:template>

C05 - DS

Page 26: C05. XPath

• Cai de localizare compuse

• Expresiile XPath – nume de elemente, @atribut, /, comment(), text() – sunt pasi de localizare „single”.

• Acestea se pot combina cu „/” pentru „deplasare” in cadrul ierarhiei de la nodul la care se potriveste pana la alte noduri => cale de localizare.

• Plus – – „.” pentru referire la nodul de context, – „..” pentru referire la nodul parinte, sau (particular) – „//” pentru referire la nodurile descendente din nodul de context.

C05 - DS

Page 27: C05. XPath

• De exemplu:/people/person/name/first_name– incepe la nodul radacina, selecteaza elementele fiu ale elementului

radacina (people), s.a.m.d., pana la selectarea „first_name”.

• Pentru exemplul de document, se vor aplica reguli pentru:<first_name>Alan</first_name><first_name>Richard</first_name>

• Pentru a indica doar continutul textual al acestor noduri (Alen si Richard), se foloseste:

/people/person/name/first_name/text()

• Exemplu: expresiaperson/@id

selecteaza atributul „id” al elementelor fiu „person” ale nodului de context.

C05 - DS

Page 28: C05. XPath

• Selectarea descendentilor cu „//”

• „//” selecteaza toti descendentii nodului de context, plus nodul de context.

• De exemplu: – //name – selecteaza toate elementele „name” din document (incepe cu

nodul radacina).

– person//@id – selecteaza atributele „id” ale oricarui element continut in elementele fiu ale „person” ale nodului de context, plus atributele „id” ale elementelor „person”.

– //* – selecteaza toate elementele din document

C05 - DS

Page 29: C05. XPath

• Selectarea elementului parinte cu „..”

• „..” indica parintele nodului curent.

• De exemplu:– //@id identifica toate atributele „id” din document, iar – //@id/.. identifica toate elementele din document care au atribute „id”.

• De exemplu:– //middle_initial/../first_name identifica toate elementele

„first_name” care sunt vecine elementelor „middle_name” in document => pentru documentul exemplu, se selecteaza

<first_name>Richard</first_name>

, si nu se selecteaza <first_name>Alan</first_name>.

C05 - DS

Page 30: C05. XPath

• Selectarea nodului de context cu „.”

• „.” indica nodul de context. In general se foloseste pentru a lua valoarea din nodul pentru care se potriveste (curent) regula de template.

• De exemplu: fiecare comentariu este copiat in elemente <span> in documentul de iesire HTML.<xsl:template match="comment()"> <span class="comment"> <xsl:value-of select="."> </span></xsl:template>

• Similar – pentru elementele „name”, intr-un output XML:<xsl:template match="name"> <one_name> <xsl:value-of select="."> </one_name></xsl:template>

C05 - DS

Page 31: C05. XPath

• Predicate

• Intr-o lista de noduri (data de o cale de localizare) se poate aplica o rafinare, cu ajutorul predicatelor – se foloseste o expresie cu rezultat Boolean, care este testata pentru fiecare nod

• Exemplu: elementele „profession” cu valoarea „physicist”; „.” = valoarea string a nodului curent (aceeasi care ar fi returnata de xsl:value-of)

<xsl:apply-templates select="//profession[.='physicist']" />

• Exemplu: elementele „person” care au elemente fiu „profession”, cu valoarea data:

//person[profession="physicist"]

• Exemplu: elementele „person” cu atributul „id”=p4567//person[@id="p4567"]

C05 - DS

Page 32: C05. XPath

• Exemplu://person[@born <= 1920 and @born >= 1910]//name[first_name = "Richard" or first_name = "Dick"]

• (sau &lt; in loc de <=)<xsl:apply-templates select="//person[@born &lt;= 1976]"/>

• Exemplu: selectarea elementelor „nume” care au un fiu „middle_initial”//name[middle_initial]

/people/person[@born < 1950]/ name[first_name = "Alan"]

C05 - DS

Page 33: C05. XPath

• Cai de localizare ne-abreviate

• Observatie: in unele din exemplele urmatoare se va folosi si sintaxa abreviata cu efect echivalent celei ne-abreviate.

C05 - DS

Page 34: C05. XPath

• Pasi de localizare

• O cale de localizare contine unul sau mai multi pasi de localizare.• Un pas de localizare este format din:

– o axa– un test de nod– un predicat optional

• Exemplu: din nodul de context se selecteaza nodurile fiu “PartsCatalog”, apoi nodurile fiu “Parts” si se proceseaza doar un element „Part” (cel cu atributul “code” = ‘AB-234’)

<xsl:apply-templates select="child::PartsCatalog/ child::Part [attribute::code='AB-234']"/>

C05 - DS

Page 35: C05. XPath

• Child axis

• Defineste fiii nodului de context:• Exemplu:<scoala deschisa="da"> Clasele I-VIII <director>Popa Marius</director> <!--Observatie: nu este nici un director adjunct --> <localitate>Dealul Mare</localitate></scoala>

• => nodul elementului radacina „scoala” are 4 fii: nodul text, nodul elementului „director”, nodul comentariu si nodul elementului „localitate”.

• Observatie: Nodul atribut „deschisa” apartine de nodul elementului „scoala”, insa este atins pe alta axa.

• child::node() – nodurile fiu (element, comentariu, text)• child::* – nodurile element fiu

C05 - DS

Page 36: C05. XPath

• Descendant axis

• Selecteaza toti fiii, fiii fiilor s.a.m.d. (ca si cum s-ar aplica child axis recursiv).

• Exemplu: <?xml version='1.0'?><Book> <Introduction> <Section>A section.</Section> <Section>Another section in the introduction</Section> </Introduction> <Chapter> <Section>A section in a chapter.</Section> <Section>Another section in a chapter.</Section> </Chapter> <Appendix> <Section>A section in an appendix.</Section> </Appendix></Book>

C05 - DS

Page 37: C05. XPath

<xsl:template match="/"> <xsl:apply-templates select="/descendant::Section"/></xsl:template><xsl:template match="Section"> <p><xsl:value-of select="."/></p></xsl:template>

• => selecteaza doar nodurile elementelor “Section”

• /descendant::Section echivelent cu //Section.

• Exemplu: selectarea paragrafelor fara a sti pe ce nivel se gasesc/publication//paragraph• sau/child::publication/descendant::paragraph

C05 - DS

Page 38: C05. XPath

• Parent axis

• Se poate selecta 0 sau 1 nod parinte; acesta poate fi nodul radacina sau un nod element; daca nodul de context este radacina, atunci pentru acesta nu se selecteaza nimic.

• Accesarea nodului parinte:parent::node()• sau..

C05 - DS

Page 39: C05. XPath

• Ancestor axis

• Se selecteaza un set noduri – nodul radacina si unul sau mai multe noduri element; pentru nodul radacina ca nod de context nu se selecteaza nimic.

• Exemplu: determinarea stramosilor unui nod „Paragraph”<Book> <Chapter> <Section>A first section</Section> <Paragraph>A paragraph in the first section. </Paragraph> </Chapter></Book>• (nodul contextual este “Paragraph”)=>ancestor::node()

C05 - DS

Page 40: C05. XPath

• Following-sibling axis

• Selecteaza nodul vecin nodului de context, care urmeaza acestuia (si au acelasi nod parinte).

• Exemplu:

<PurchaseOrder> <Customer>Wonder Gadget Company Inc</Customer> <LineItem>A widget</LineItem> <LineItem>A dooda</LineItem> <LineItem>A whotsit</LineItem> <LineItem quantity="3">thingy</LineItem> <LineItem quantity="4">gadget</LineItem></PurchaseOrder>

C05 - DS

Page 41: C05. XPath

<xsl:template match="/"> <xsl:apply-templates select="PurchaseOrder/

LineItem[position()=3]/following-sibling::*"/>

</xsl:template><xsl:template match="LineItem"> <p><xsl:value-of select="."/></p></xsl:template>

• => se va afisa „LineItem” de pe pozitia 4.• Aceasta axa nu se poate descrie cu sintaxa abreviata.

C05 - DS

Page 42: C05. XPath

• Preceding-sibling axis

• Selecteaza nodul vecin nodului de context, care il precede in document (si au acelasi nod parinte).

• Exemplu: modificare in exemplul anterior<xsl:apply-templates select= "PurchaseOrder/

LineItem[position()=3]/preceding-sibling::*"/>

• => afiseaza “LineItem” de pe pozitia 2 din „PurchaseOrder”• Aceasta axa nu se poate descrie cu sintaxa abreviata.

C05 - DS

Page 43: C05. XPath

• Following axis

• Selecteaza nodurile ce urmeaza nodului de context, fara descendenti nodului de context.

• Exemplu:

C05 - DS

<Volume> <Number>3</Number> <Author>John Smith</Author> <Title>Space Travel for dinosaurs</Title> <PublicationDate>20th June 2303</PublicationDate> <Chapter number="1">The first chapter starts here. <Section>...</Section> </Chapter> <Chapter number="2">The second chapter starts here. <Section>...</Section> </Chapter> <Chapter number="3">The third chapter starts here. <Section>The first section in the third chapter. </Section> <Section>The second section in the third chapter. </Section> <Section>The third section in the third chapter. </Section> </Chapter> <Appendix> <Section>...<Section> </Appendix></Volume>

Page 44: C05. XPath

<xsl:template match="/"> <xsl:apply-templates

select="/Volume/Chapter[@number='3']/following::*"/></xsl:template><xsl:template match="Appendix"> <p><xsl:value-of select="name()"/></p></xsl:template><xsl:template match="Section"> <p><xsl:value-of select="name()"/></p></xsl:template><xsl:template match="Chapter"> <p><xsl:value-of select="name()"/></p></xsl:template>

• => Appendix & Section (ultimele)• Aceasta axa nu se poate descrie cu sintaxa abreviata.

C05 - DS

Page 45: C05. XPath

• Preceding axis

• Selecteaza nodurile ce preced nodul de context, fara descendenti.

• Exemplu:

<xsl:template match="/"> <xsl:apply-templates select="/Volume/Chapter[@number='2']/preceding::*"/></xsl:template><xsl:template match="Appendix"> <p><xsl:value-of select="name()"/></p></xsl:template><xsl:template match="Section"> <p><xsl:value-of select="name()"/></p></xsl:template><xsl:template match="Chapter | Introduction | PublicationDate | Title | Author

| Number | Volume"> <p><xsl:value-of select="name()"/></p></xsl:template>

• => Number, Author, Title, PublicationDate, Introduction, Chapter (1)• Aceasta axa nu se poate descrie cu sintaxa abreviata.

C05 - DS

Page 46: C05. XPath

• Attribute axis• Contine nodurile asociate unui nod de tip element (altfel, este gol).• Accesare: attribute::AttributeName echivalent cu @AttributeName.• Exemplu: attribute::* echivalent cu @*

• Self axis• Contine un singur nod = nodul de context.• Accesare: self::node() echivalent cu „.”.

• Descendant-or-self axis• Include self axis & descendant axis.

• Ancestor-or-self axis• Include self axis & ancestor axis.

C05 - DS

Page 47: C05. XPath

• Test de nod

• Orice cale de localizare are cel putin un pas de localizare si fiecare pas de localizare trebuie sa aiba un test de nod.

• Testul de nod poate fi vazuta ca o filtrare asupra setului de noduri reprezentat de o axa.– axis::* => toate nodurile selectate de axa– axis::element_name => nodurile cu numele dat, de pe axa

specificata– axis::node()=> toate nodurile– axis::text() => nodurile text– axis::comment() => nodurile comentariu

C05 - DS

Page 48: C05. XPath

• Predicate

• Un predicat este optional in fiecare pas de localizare; efectueaza o filtrare suplimentara, dupa selectia data de axa si testul de nod.

• Exemplu:

<Book> <Chapter order="first">first chapter</Chapter> <Chapter order="second">second chapter</Chapter> <Chapter order="third">third chapter</Chapter> <Chapter order="fourth">fourth chapter</Chapter> <Chapter order="fifth">fifth chapter</Chapter> <Chapter order="sixth">sixth chapter</Chapter></Book>

C05 - DS

Page 49: C05. XPath

• si

<xsl:template match="/">

<xsl:apply-templates select="/Book/Chapter[position()=4]"/>

</xsl:template>

<xsl:template match="Chapter">

<xsl:value-of select="."/>

<xsl:value-of select="following-sibling::*[position()=1]"/>

<xsl:value-of select="preceding-sibling::*[position()=1]"/>

</xsl:template>

• => se afiseaza capitolele 5 si 3 (plus cel curent - 4).

C05 - DS

Page 50: C05. XPath

• Functii XPath

• Apelul functiilor

• Un apel de functie poate sa apara intr-o expresie XPath.

• Exemplu:/child::book/child::chapter[position()>2]• => selecteaza din radacina, elementul book, si capitolele cu numarul de

ordine > 2; pentru fiecare asemenea capitol ar putea instantia un template de forma:

<xsl:template match="/book/chapter">

• O functie XPath nu poate fi apelata intr-o expresie XPath dupa caracterul „/”.

C05 - DS

Page 51: C05. XPath

• Functii pentru set de noduri

• Functiile pentru seturi de noduri opereaza sau returneaza informatii despre un set de noduri.

– position() – pozitia elementului

– last() – numarul de noduri in lista nodului de context (echivalent cu pozitia ultimului nod din lista)

– count() – numarul de noduri din setul dat ca parametru.

• Exemplu: count(//name) – numara cati descendenti cu numele “name” exista (din nodul contextual)

C05 - DS

Page 52: C05. XPath

• Exemplu: persoanele x din totalul de n persoane:

<?xml version="1.0"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="people"> <xsl:apply-templates select="person"/> </xsl:template>

<xsl:template match="person"> Person <xsl:value-of select="position()"/> of <xsl:value-of select="count(//person)"/> : <xsl:value-of select="name"/> </xsl:template></xsl:stylesheet>

C05 - DS

Page 53: C05. XPath

• Exemplu: numarul de capitole

<xsl:template match="/"> <xsl:value-of select="count(Chapters/Chapter)"/>

Chapter elements.</p></xsl:template>

• Exemplu: pe ce nivel se gaseste un nod

<xsl:template match="/"> <xsl:apply-templates select="ElementNode/Level2/Level3/Level4"/></xsl:template><xsl:template match="Level4"> <xsl:value-of select="count(ancestor::*)"/></xsl:template>

C05 - DS

Page 54: C05. XPath

• Exemplu: afisarea ultimului element „Section”

<Chapter>

<Section>the first section.</Section>

<Section>the second section.</Section>

<Section>the third section.</Section>

<Section>the fourth section.</Section>

</Chapter>• si...

<xsl:template match="/">

<xsl:apply-templates select="Chapter/Section[last()]"/>

</xsl:template>

<xsl:template match="Section">

<p><xsl:value-of select="."/></p>

</xsl:template>• sau

<xsl:apply-templates

select="Chapter/Section[position()=last()]"/>

C05 - DS

Page 55: C05. XPath

• Functii pentru string• string() – converteste argumentul, in masura in care poate, la string.

Daca argumentul este un set de noduri, se ia valoarea primului nod din set (similar cu xsl:value-of).

• starts_with() – exemplu: starts-with('Richard', 'Ric')• contains() – exemplu: contains('Richard', 'ar')• substring_before(s1, s2) – primeste doua stringuri s1 si s2 – returneaza

substringul din s1 care apare inainte de prima aparitie a lui s2 in s1; daca s2 nu apare in s1, se returneaza string vid.

• substring_after(s1, s2) – similar;• substring(s, poz_init, lg) – extrage substring din string-ul s, de la

poz_init, de lungime lg.• string_length() – returneaza lungimea stringului dat ca argument; daca

nu e dat, se returneaza lungimea continutului pentru nodul de context; exemplu: string-length(//name[position( )=1]).

• concat(s1, s2, …)

C05 - DS

Page 56: C05. XPath

• Functii Boolean

• true(), false(), not()• Functia not() este echivalenta operatorului logic de negare:.='computer scientist'not(.='computer scientist')

• boolean() – primeste un argument pe care-l converteste la Boolean; daca nu primeste – face conversia pentru nodul de context. – Numar = 0 => false, numar <> 0 => true. – Set de noduri gol => false, set de noduri not-gol => true. – String de lungime 0 => false, string de lungime <> 0 => true.

C05 - DS

Page 57: C05. XPath

• Functii numerice

• number() – conversie la numar pentru argument sau pentru nodul de context (vezi reguli de conversie)

• round(),• floor(),• ceiling()• Si altele…

C05 - DS

Page 58: C05. XPath

• Functii pentru date calendaristice / timp / durata

• dateTime(date, time) – converteste argumentele la data si timp• year-from-dateTime(datetime) – componenta an din argument (similar

pentru luna, zi, ora, minute, secunde, timezone)• year-from-date(date) – componenta an din argument (similar pentru

luna, zi)• hours-from-time(time) – componenta ora din argument (similar minute,

secunde)• current-date(), current-time()• Si altele…

• Observatie: fn:functie(), unde fn = http://www.w3.org/2005/xpath-functions

C05 - DS

Page 59: C05. XPath

• Functii de agregare

• count((e1, e2, ...)) – numarul de elemente din secventa• sum(set_de_noduri sau secventa de argumente) – converteste fiecare

nod la string, fiecare string la numar, si returneaza suma acestora• similar – min, max, avg

C05 - DS

Page 60: C05. XPath

• Exemplu:

<Q1Sales Year="2003">

<January>17.49</January>

<February>18.51</February>

<March>21.50</March>

</Q1Sales>

• si...

<xsl:template match="/">

<xsl:value-of select="Q1Sales/@Year"/>

<xsl:value-of select="sum(Q1Sales/*)"/>

</xsl:template>

C05 - DS

Page 61: C05. XPath

• Next 06– XSLT

C05 - DS