XPath

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 8 septembrie 2017; verificările necesită 14 modificări .

XPath (XML Path Language) este un limbaj de interogare pentru elementele unui document XML . Proiectat pentru a accesa părți ale unui document XML în fișiere de transformare XSLT și este un standard W3C . XPath își propune să implementeze navigarea DOM în XML . XPath utilizează o sintaxă compactă care este diferită de XML. Versiunea 2.0 a fost finalizată în 2007 și acum face parte din limbajul XQuery 1.0. În decembrie 2009, a început dezvoltarea versiunii 2.1, care folosește XQuery 1.1.

În acest moment, cea mai populară versiune este XPath 1.0. Acest lucru se datorează lipsei suportului XPath 2.0 din bibliotecile open source. În special, vorbim despre libxml2 , de care depinde suportul de limbă în browsere, pe de o parte, și suportul de la interpretul de server, pe de altă parte.

Bazele

XML are o structură arborescentă. Un document XML independent are întotdeauna un element rădăcină (instrucțiunea <?xml version="1.0"?> nu are nimic de-a face cu arborele de elemente), în care sunt permise un număr de elemente imbricate, dintre care unele pot conține și elemente imbricate . De asemenea, puteți vedea noduri de text, comentarii și instrucțiuni. Vă puteți gândi la un element XML ca având o matrice de elemente imbricate și o matrice de atribute.

Elementele arborelui au elemente strămoși și elemente descendente (elementul rădăcină nu are strămoși, iar elementele cioț (frunzele copacului) nu au copii). Fiecare element al arborelui se află la un anumit nivel de cuibărit (denumit în continuare „nivel”). Elementele sunt ordonate în ordine în textul XML și astfel putem vorbi despre elementele lor anterioare și următoare. Acest lucru este foarte asemănător cu organizarea directoarelor într-un sistem de fișiere.

Linia XPath descrie cum să selectați elementele dorite dintr-o serie de elemente, care pot conține elemente imbricate. Selecția începe cu setul de elemente trecut, la fiecare pas al căii sunt selectate elementele corespunzătoare expresiei pasului și, ca urmare, este selectat un subset de elemente corespunzător căii date.

De exemplu, luați următorul document XHTML :

< html > < corp > < div > Primul strat < span > bloc de text în primul strat </ span > </ div > < div > Al doilea strat </ div > < div > Al treilea strat < span class = "text" > primul bloc din al treilea strat </ span > < span class = "text" > al doilea bloc în al treilea strat </ span > < span > al treilea bloc în al treilea strat </ span > </ div > < span > al patrulea strat </ span > < img /> </ corp > </ html >

Calea XPath /html/body/*/span[@class] se va potrivi cu două elemente ale documentului sursă din ea - <span class="text">первый блок в третьем слое</span>și <span class="text">второй блок в третьем слое</span>.

Elementele de cale sunt scrise predominant în XPath sub formă scurtă. Forma completă a căii de mai sus este /child::html/child::body/child::*/child::span[atribut::class]

Calea constă în pași de adresare, care sunt separați printr-o bară oblică /.

Fiecare pas de adresare constă din trei părți:

  • axa (fiul implicit::, axa elementului). Pe lângă filtrarea de-a lungul axei elementelor imbricate, puteți selecta de-a lungul diferitelor axe ale elementelor și de-a lungul axei atributelor (atribut::, este de asemenea notat cu simbolul @) (vezi mai jos).
  • o expresie care definește elementele de selectat (în exemplu, selecția se face prin potrivirea elementelor documentului cu numele html, body, span, iar simbolul este folosit *, care va selecta toate elementele axei)
  • predicate (în acest exemplu este attribute::class) — condiții suplimentare de selecție. Pot fi mai multe. Fiecare predicat este cuprins între paranteze pătrate și implică o expresie logică pentru a testa elementele selectate. Dacă nu există nici un predicat, atunci toate elementele care se potrivesc sunt selectate.

Calea este analizată de la stânga la dreapta și începe fie în contextul primului element al nodului rădăcină (în acest exemplu, acesta este elementul html), iar apoi de-a lungul axei child:: vor exista elemente imbricate în ea (în acest exemplu, acesta este un element body), ceea ce este convenabil în cazul procesării unui document XML obișnuit cu un singur nod rădăcină sau, dacă caracterul este specificat la începutul XPath /, în context cu toate elementele rădăcină a XML-ului transmis de-a lungul axei child:: (în acest exemplu, acesta va fi un singur element html). La fiecare pas de adresare în contextul curent, sunt selectate elemente care corespund condițiilor specificate în pas, iar lista lor este luată ca context pentru pasul următor sau ca rezultat de întoarcere.

Astfel, primul pas /child::htmlface explicit contextul curent pentru pasul următor o listă cu un element html, ceea ce s-ar fi făcut implicit dacă acest pas nu ar fi fost specificat.

În al doilea pas de adresare din acest exemplu (pasul child::body), contextul este o listă cu un element html. Axa child:: spune că trebuie să vă uitați la numele elementelor imbricate în contextul curent, iar condiția de verificare a corpului spune că acele noduri care au numele corpului trebuie incluse în setul generat de elemente. Astfel, în timpul celui de-al doilea pas de adresare, obținem un set de noduri format dintr-un singur element corp, care devine contextul celui de-al treilea pas.

Al treilea pas de adresare: copil::* . Axa child:: conține toți copiii direcți ai elementului body, iar condiția de testare * spune că elementele de tip principal cu orice nume ar trebui incluse în lista generată. În timpul acestui pas, obținem o listă formată din trei elemente div, un span și un element img - un total de cinci elemente.

Al patrulea pas de adresare: child::span/@class. Contextul său este o listă de cinci articole, astfel încât lista de ieșire este creată în cinci treceri (cinci iterații). La prima iterație, primul div devine nodul context. Având în vedere axa child:: și regula testului span, setul trebuie să includă copiii imediati ai acestei div, al căror nume este egal cu span. Există unul acolo. La a doua iterație, nimic nu va fi adăugat la set, deoarece a doua div nu are copii. A treia iterație va vedea trei elemente span simultan. Al patrulea nu va vedea nimic, deoarece elementul span nu are descendenți span, iar faptul că este o span în sine nu contează, pentru că descendenții sunt priviți. Nici cel de-al cincilea nu va vedea nimic, nici elementul img nu are copii span. Deci, în timpul testului, s-a putut obține un set de noduri constând din patru elemente span. Acesta ar fi contextul pentru procesarea ulterioară dacă nu s-ar specifica niciun predicat la acest pas.

Dar, deoarece există un predicat la al patrulea pas, pe măsură ce fiecare dintre cele cinci treceri este efectuată, se va efectua filtrarea suplimentară a elementelor selectate. În acest caz, axa atribut:: a predicatului indică necesitatea de a verifica dacă nodul selectat are atribute, iar condiția de clasă necesită lăsarea doar a acelor noduri care au un atribut numit class. Și, prin urmare, la prima iterație, singurul interval găsit nu va trece filtrarea de către predicat, la a treia iterație, două din trei elemente vor trece filtrarea și, ca urmare, în ciuda faptului că filtrarea are loc peste cinci iterații, doar două elemente span intră în setul final.

Topoare

Axele sunt baza limbajului XPath. Există abrevieri pentru unele axe.

  • copil::  - contine un set de elemente descendente (elemente situate la un nivel mai jos). Acest nume este abreviat complet, adică poate fi omis cu totul.
  • descendent::  - contine setul complet de elemente descendente (adica atat elementele descendente cele mai apropiate cat si toate elementele descendente ale acestora). Expresia /descendant::node()/poate fi scurtată la //.
  • descendant-or-self::  conține setul complet de elemente descendente și elementul curent. Cu ajutorul acestei axe, de exemplu, este posibil să se organizeze selecția elementelor din orice nod, și nu numai din nodul rădăcină, ca al doilea pas: este suficient să luăm toți descendenții nodului rădăcină ca primul pas. De exemplu, o cale //spanva selecta toate nodurile din spandocument, indiferent de poziția lor în ierarhie, uitându-se atât la numele elementului rădăcină, cât și la numele tuturor copiilor acestuia, până la adâncimea completă a cuibării lor.
  • strămoș::  - conține multe elemente strămoși.
  • ancestor-or-self::  conține setul de elemente strămoși și elementul curent.
  • părinte::  - conține elementul strămoș cu un nivel înapoi. Acest apel poate fi înlocuit cu..
  • self::  - contine elementul curent. Acest apel poate fi înlocuit cu.
  • următoarele::  - conține un set de elemente situate sub elementul curent din arbore (la toate nivelurile și straturile), excluzând proprii descendenți.
  • follow-sibling::  conține un set de elemente frați care urmează stratului curent.
  • precedent::  - contine setul de elemente de deasupra elementului curent din arbore (la toate nivelurile si straturile), excluzand multimea stramosilor proprii.
  • preceding-sibling::  conține un set de elemente frați care preced stratul curent.
  • attribute::  - conține un set de atribute ale elementului curent. Această invocare poate fi înlocuită cu simbolul@
  • namespace::  - conține un set de elemente legate de un anumit namespace (adică există un atribut xmlns).

O expresie care specifică elementele de selectat

În cadrul conținutului axei , selecția se realizează în funcție de expresia care definește elementele de selectat.

Ca expresie poate fi

  • este specificat un nume specific, apoi sunt selectate elementele de axă corespunzătoare acestui nume
  • este specificat simbolul *, care va selecta toate elementele axei
  • este specificată o expresie compusă din funcții, iar apoi vor fi selectate rezultatele calculului expresiei în contextul fiecărui element al axei

Funcțiile sunt împărțite în 5 grupe:

Funcții peste seturi de noduri

Funcţie Descriere
node-set node() Returnează nodul în sine. În loc de această funcție, înlocuitorul este adesea folosit *, dar, spre deosebire de asterisc, funcția node()returnează și noduri text
string text() Returnează nodul dacă este text
node-set current() Returnează un set de un element, care este cel curent. Dacă procesăm setările cu predicate, atunci singura modalitate de a ajunge la elementul curent din acest predicat va fi această funcție
number position() Returnează poziția unui element în setul de elemente ale axei. Funcționează corect numai într-o buclă<xsl:for-each/>
number last() Returnează numărul ultimului element din setul de elemente ale axei. Funcționează corect numai într-o buclă<xsl:for-each/>
number count(node-set) Returnează numărul de elemente în node-set.
string name(node-set?) Returnează numele complet al primei etichete din set
string namespace-url(node-set?) Returnează un link către o adresă URL care specifică un spațiu de nume
string local-name(node-set?) Returnează numele primei etichete din set, fără spațiu de nume
node-set id(object) Găsește un element cu un id unic

Funcții șir

Funcţie Descriere
string string(object?) Returnează conținutul text al elementului. În esență, returnează setul îmbinat de elemente de text cu un nivel mai jos
string concat(string, string, string*) Concatenează șirurile specificate în argumente
number string-length(string?) Returnează lungimea șirului
boolean contains(string, string) Returnează truedacă prima linie conține a doua, în caz contrar -false
string substring(string, number, number?) Returnează un șir tăiat dintr-un șir, începând cu numărul specificat și, dacă este specificat un al doilea număr, numărul de caractere
string substring-before(string, string) Dacă al doilea șir este găsit în primul, returnează șirul până la prima apariție a celui de-al doilea șir
string substring-after(string, string) Dacă al doilea șir este găsit în primul, returnează șirul după prima apariție a celui de-al doilea șir
boolean starts-with(string, string) Returnează truedacă a doua linie este la începutul primei, în caz contrar -false
boolean ends-with(string, string) Returnează truedacă a doua linie este la sfârșitul primei, în caz contrar -false
string normalize-space(string?) Elimină spațiile suplimentare și repetate, precum și caracterele de control, înlocuindu-le cu spații
string translate(string, string, string) Înlocuiește caracterele din primul șir care apar în al doilea șir cu caracterele din al treilea șir corespunzătoare pozițiilor caracterelor din al doilea șir. De exemplu, translate("bar", "abc", "ABC")va returna BAR.

Funcții și operatori booleeni

Simbol, operator Sens
or "sau" logic
and "și" logic
= „egal” logic
<(<) logic „mai puțin decât”
>(>) logic "mai mare"
<=(<=) logic „mai mic sau egal cu”
>=(>=) logic „mai mare sau egal”
Funcţie Descriere
boolean boolean(object) Transmite un obiect într-un tip boolean
boolean true() Returnează adevărat
boolean false() Returnează false
boolean not(boolean) Negație, returnează adevărat dacă argumentul este fals și invers

Funcții și operatori numerici

Simbol, operator Sens
+ plus
scădere
* multiplicare
div diviziune regulată ( nu întreg! )
mod restul diviziei
Funcţie Descriere
number number(object?) Transformă un obiect într-un număr
number sum(node-set) Returnează suma setului. Fiecare etichetă setată va fi convertită într-un șir și se va obține un număr din acesta
number floor(number) Returnează cel mai mare număr întreg nu mai mare decât argumentul (rotunjind în jos)
number ceiling(number) Returnează cel mai mic număr întreg nu mai mic decât argumentul (rotunjire în sus)
number round(number) Rotunjește un număr conform regulilor matematice

Funcțiile sistemului

Funcţie Descriere
node-set document(object, node-set?) Returnează documentul specificat în parametruobject
string format-number(number, string, string?) Formatează un număr conform modelului specificat în al doilea parametru. Al treilea parametru specifică formatul numerelor denumite care trebuie luat în considerare.
string generate-id(node-set?) Returnează un șir care este un identificator unic
node-set key(string, object) Returnează un set cu cheia specificată (similar cu funcția idpentru identificatori)
string unparsed-entity-uri(string) Returnează URI-ul neanalizat. Dacă nu există, returnează un șir gol
boolean element-available(string) Verifică dacă elementul sau setul specificat în parametru este disponibil. Parametrul este tratat ca XPath
boolean function-available(string) Verifică dacă funcția specificată în parametru este disponibilă. Parametrul este tratat ca XPath
object system-property(string) Parametri care returnează variabile de sistem. Poate fi:
  • xsl: version - returnează versiunea XSLT a procesorului.
  • xsl: vendor - returnează producătorul procesorului XSLT.
  • xsl: vendor-url - returnează o adresă URL care identifică producătorul.

Dacă se folosește un parametru necunoscut, funcția returnează un șir gol

boolean lang(string) Returnează truedacă eticheta curentă are un atribut xml: langsau dacă părintele etichetei are un atribut xml: langși conține caracterul care se potrivește cu șirul

Predicate

Predicatele sunt expresii logice între paranteze drepte, construite după aceleași principii ca și expresia de selecție. Expresiile care returnează nu o valoare booleană, ci un set gol de elemente sunt considerate false. O expresie care returnează un număr este considerată o expresie care compară numărul cu position(). Când există mai mult de un predicat, fiecare dintre ele filtrează rezultatele filtrării după predicatul anterior.

Alte notații în XPath

Desemnare Descriere
* Indică orice nume sau set de caractere de-a lungul axei specificate, de exemplu: * - orice nod copil; @* - orice atribut
$name Accesarea unei variabile. name — numele variabilei sau al parametrului
[] Condiții suplimentare de selecție (sau predicat pas de adresare). Trebuie să conțină o valoare booleană. Dacă conține o valoare numerică, se consideră că este numărul ordinal al nodului, ceea ce echivalează cu prefixarea acestui număr cu expresiaposition()=
{} Dacă este folosit în interiorul unei etichete într-o altă limbă (cum ar fi HTML), atunci procesorul XSLT tratează conținutul acoladelor ca un XPath
/ Definește nivelul arborelui, adică separă pașii de adresare
| Îmbină rezultatul. Adică, într-o singură cale, puteți scrie mai multe căi de analiză prin semnul |, iar rezultatul unei astfel de expresii va include tot ceea ce va fi găsit prin oricare dintre aceste căi

Link -uri