1 / 61

C05. XPath

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).

toviel
Download Presentation

C05. XPath

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C05. XPath Date Semistructurate, 2012-2013

  2. C05. DS • XPath

  3. C05 - DS • 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.

  4. C05 - DS • 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.

  5. C05 - DS • 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.

  6. C05 - DS • 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.

  7. C05 - DS • 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>

  8. C05 - DS • 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”

  9. C05 - DS • 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>

  10. C05 - DS • 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>

  11. C05 - DS • 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.

  12. C05 - DS • Cai de localizare XPath • Pentru descrierea cailor de localizare se pot folosi patru sintaxe XPath: • cai de localizare absolutene-abreviate • cai de localizare relativene-abreviate • cai de localizare absoluteabreviate • cai de localizare relativeabreviate

  13. C05 - DS 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

  14. C05 - DS • Cai de localizare abreviate

  15. C05 - DS • 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>

  16. C05 - DS • 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>

  17. C05 - DS • 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>

  18. C05 - DS • 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>

  19. C05 - DS <?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>

  20. C05 - DS • 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>

  21. C05 - DS • 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

  22. C05 - DS • 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>

  23. C05 - DS • 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>

  24. C05 - DS • 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>

  25. C05 - DS • 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>

  26. C05 - DS • 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.

  27. C05 - DS • 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: expresia person/@id selecteaza atributul „id” al elementelor fiu „person” ale nodului de context.

  28. C05 - DS • 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

  29. C05 - DS • 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>.

  30. C05 - DS • 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>

  31. C05 - DS • 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"]

  32. C05 - DS • 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"]

  33. C05 - DS • Cai de localizare ne-abreviate • Observatie: in unele din exemplele urmatoare se va folosi si sintaxa abreviata cu efect echivalent celei ne-abreviate.

  34. C05 - DS • 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']"/>

  35. C05 - DS • 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

  36. C05 - DS • 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>

  37. C05 - DS <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

  38. C05 - DS • 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 ..

  39. C05 - DS • 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 firstsection. </Paragraph> </Chapter> </Book> • (nodul contextual este “Paragraph”)=> ancestor::node()

  40. C05 - DS • 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>

  41. C05 - DS <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.

  42. C05 - DS • 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.

  43. 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> • Following axis • Selecteaza nodurile ce urmeaza nodului de context, fara descendenti nodului de context. • Exemplu:

  44. C05 - DS <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.

  45. C05 - DS • 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.

  46. C05 - DS • 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.

  47. C05 - DS • 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

  48. C05 - DS • 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>

  49. C05 - DS • 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).

  50. C05 - DS • 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 „/”.

More Related