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.
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:
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.
Axele sunt baza limbajului XPath. Există abrevieri pentru unele axe.
În cadrul conținutului axei , selecția se realizează în funcție de expresia care definește elementele de selectat.
Ca expresie poate fi
Funcțiile sunt împărțite în 5 grupe:
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ţ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. |
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 |
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ţ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:
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 |
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.
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 |
Limbi de interogare | |
---|---|
XSL | |
---|---|
Consorțiul World Wide Web (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Produse și standarde |
| ||||||||||||||
Organizații |
| ||||||||||||||
PE |
| ||||||||||||||
Conferințe |
|