XPath (XML Path Language) on XML - dokumentin elementtien kyselykieli . Suunniteltu käyttämään osia XML - dokumentista XSLT - muunnostiedostoissa ja se on W3C - standardi . XPath pyrkii toteuttamaan DOM -navigoinnin XML :ssä . XPath käyttää kompaktia syntaksia, joka eroaa XML:stä. Versio 2.0 valmistui vuonna 2007, ja se on nyt osa XQuery 1.0 -kieltä. Joulukuussa 2009 aloitettiin XQuery 1.1 -versiota käyttävän version 2.1 kehitys.
Tällä hetkellä suosituin versio on XPath 1.0. Tämä johtuu XPath 2.0 -tuen puutteesta avoimen lähdekoodin kirjastoista. Erityisesti puhumme libxml2 :sta, josta riippuu toisaalta selainten kielituki ja toisaalta palvelintulkin tuki.
XML:llä on puurakenne. Itsenäisessä XML-dokumentissa on aina yksi juurielementti (käskyllä <?xml version="1.0"?> ei ole mitään tekemistä elementtipuun kanssa), jossa sallitaan joukko sisäkkäisiä elementtejä, joista osa voi sisältää myös sisäkkäisiä elementtejä. . Voit myös nähdä tekstisolmuja, kommentteja ja ohjeita. Voit ajatella, että XML-elementti sisältää joukon sisäkkäisiä elementtejä ja joukon attribuutteja.
Puuelementeillä on esi- ja jälkeläiselementtejä (juurielementillä ei ole esi-isiä, ja tynkäelementeillä (puun lehdillä) ei ole lapsia). Jokainen puun elementti on tietyllä pesimätasolla (jäljempänä "taso"). Elementit on järjestetty XML-tekstissä järjestykseen, joten voimme puhua niiden edellisistä ja seuraavista elementeistä. Tämä on hyvin samanlaista kuin hakemistojen järjestäminen tiedostojärjestelmässä.
XPath-rivi kuvaa, kuinka halutut elementit valitaan elementtijoukosta, joka voi sisältää sisäkkäisiä elementtejä. Valinta alkaa ohitetusta elementtijoukosta, polun jokaisessa vaiheessa valitaan askellauseketta vastaavat elementit ja tuloksena valitaan annettua polkua vastaava elementtien osajoukko.
Otetaan esimerkiksi seuraava XHTML - dokumentti:
< html > < runko > < div > Ensimmäinen kerros < span > tekstilohko ensimmäisessä kerroksessa </ span > </ div > < div > Toinen kerros </ div > < div > Kolmas kerros < span class = "text" > ensimmäinen lohko kolmannessa kerroksessa </ span > < span class = "text" > toinen lohko kolmannessa kerroksessa </ span > < span > kolmas lohko kolmannessa kerroksessa </ span > </ div > < span > neljäs kerros </ span > < img /> </ body > </ html >XPath-polku /html/body/*/span[@class] vastaa kahta siinä olevan lähdedokumentin elementtiä - <span class="text">первый блок в третьем слое</span>ja <span class="text">второй блок в третьем слое</span>.
Polkuelementit kirjoitetaan pääasiassa XPathissa lyhyessä muodossa. Yllä olevan polun täydellinen muoto on /child::html/child::body/child::*/child::span[attribuutti::luokka]
Polku koostuu osoitevaiheista, jotka on erotettu vinoviivalla /.
Jokainen osoitusvaihe koostuu kolmesta osasta:
Polku analysoidaan vasemmalta oikealle ja alkaa joko juurisolmun ensimmäisen elementin kontekstista (tässä esimerkissä tämä on html-elementti), ja sitten ali::-akselia pitkin siihen on sisäkkäisiä elementtejä. (tässä esimerkissä tämä on yksi body-elementti), mikä on kätevää silloin, kun käsitellään tavallista XML-dokumenttia yhdellä juurisolmulla, tai jos merkki on määritetty XPathin alussa /, kontekstissa kaikkien juurielementtien kanssa välitetystä XML:stä lapsi::-akselia pitkin (tässä esimerkissä tämä on yksittäinen html-elementti). Jokaisessa nykyisen kontekstin osoitusvaiheessa valitaan elementit, jotka vastaavat vaiheessa määritettyjä ehtoja, ja niiden luettelo otetaan seuraavan vaiheen kontekstiksi tai palautustuloksena.
Näin ollen ensimmäinen vaihe /child::htmltekee eksplisiittisesti seuraavan vaiheen nykyisestä kontekstista luettelon yhdestä html-elementistä, mikä olisi tehty implisiittisesti, jos tätä vaihetta ei olisi määritetty.
Tämän esimerkin toisessa osoitusvaiheessa (lapsi::body-vaihe) konteksti on luettelo yhdestä html-elementistä. Lapsi::-akseli sanoo, että sinun on tarkasteltava sisäkkäisten elementtien nimiä nykyisessä kontekstissa, ja body check -ehto sanoo, että ne solmut, joilla on nimi body, on sisällytettävä luotuun elementtijoukkoon. Siten toisen osoitusvaiheen aikana saamme vain yhdestä runkoelementistä koostuvan solmujoukon, josta tulee kolmannen vaiheen konteksti.
Osoittamisen kolmas vaihe: lapsi::* . Lapsi::-akseli sisältää kaikki body-elementin suorat lapset, ja *-testiehto sanoo, että päätyypin elementit millä tahansa nimellä tulisi sisällyttää luotuun luetteloon. Tämän vaiheen aikana saamme luettelon, joka koostuu kolmesta div-elementistä, yhdestä span ja yhdestä img-elementistä - yhteensä viisi elementtiä.
Neljäs osoitusvaihe: lapsi::span/@luokka. Sen konteksti on viiden kohteen luettelo, joten lähtevä luettelo luodaan viidessä kierrossa (viisi iteraatiota). Ensimmäisessä iteraatiossa ensimmäisestä div:stä tulee kontekstisolmu. Kun otetaan huomioon lapsi::-akseli ja span testisääntö, joukossa on oltava tämän div:n välittömät lapset, joiden nimi on yhtä suuri kuin span. Siellä on yksi. Toisessa iteraatiossa joukkoon ei lisätä mitään, koska toisella div:llä ei ole lapsia. Kolmannessa iteraatiossa nähdään kolme span elementtiä kerralla. Neljäs ei näe mitään, koska span elementillä ei ole span jälkeläisiä, ja sillä, että se on jänne, ei ole väliä, koska katsotaan jälkeläisiä. Viideskään ei näe mitään, img-elementillä ei myöskään ole span-lapsia. Testin aikana saatiin siis neljästä span elementistä koostuva solmujoukko. Tämä olisi jatkokäsittelyn konteksti, jos predikaattia ei määritetä tässä vaiheessa.
Mutta koska neljännessä vaiheessa on predikaatti, kun jokainen viidestä läpikäynnistä suoritetaan, valituille elementeille suoritetaan lisäsuodatus. Tässä tapauksessa predikaatin attribuutti:: akseli ilmaisee tarpeen tarkistaa, onko valitulla solmulla attribuutteja, ja luokkaehto edellyttää, että jätetään vain ne solmut, joilla on attribuutti nimeltä class. Ja siksi ensimmäisessä iteraatiossa ainoa löydetty jänneväli ei läpäise suodatusta predikaatilla, kolmannessa iteraatiossa kaksi kolmesta elementistä läpäisee suodatuksen, ja sen seurauksena huolimatta siitä, että suodatus tapahtuu yli viisi iteraatiota, vain kaksi span elementtiä pääsee lopulliseen joukkoon.
Akselit ovat XPath-kielen perusta . Joistakin akseleista on lyhenteitä.
Akselin sisällössä valinta suoritetaan sen lausekkeen mukaan, joka määrittelee valittavat elementit.
Ilmaisuna se voi olla
Toiminnot on jaettu 5 ryhmään:
Toiminto | Kuvaus |
---|---|
node-set node() | Palauttaa itse solmun. Tämän funktion sijasta käytetään usein korviketta *, mutta toisin kuin tähdellä, funktio palauttaa node()myös tekstisolmuja |
string text() | Palauttaa solmun, jos se on tekstiä |
node-set current() | Palauttaa yhden elementin joukon, joka on nykyinen. Jos suoritamme käsittelyn predikaatilla, ainoa tapa saavuttaa nykyinen elementti tästä predikaatista on tämä funktio |
number position() | Palauttaa elementin sijainnin akselielementtien joukossa. Toimii oikein vain silmukassa<xsl:for-each/> |
number last() | Palauttaa akselielementtien joukon viimeisen elementin numeron. Toimii oikein vain silmukassa<xsl:for-each/> |
number count(node-set) | Palauttaa elementtien määrän kohteessa node-set. |
string name(node-set?) | Palauttaa joukon ensimmäisen tagin koko nimen |
string namespace-url(node-set?) | Palauttaa linkin URL-osoitteeseen, joka määrittää nimitilan |
string local-name(node-set?) | Palauttaa joukon ensimmäisen tagin nimen ilman nimiavaruutta |
node-set id(object) | Löytää elementin, jolla on yksilöllinen tunnus |
Toiminto | Kuvaus |
---|---|
string string(object?) | Palauttaa elementin tekstisisällön. Palauttaa olennaisesti yhdistetyn tekstielementtien joukon yhden tason alaspäin |
string concat(string, string, string*) | Yhdistää argumenteissa määritetyt merkkijonot |
number string-length(string?) | Palauttaa merkkijonon pituuden |
boolean contains(string, string) | Palauttaa true, jos ensimmäinen rivi sisältää toisen, muuten -false |
string substring(string, number, number?) | Palauttaa merkkijonon, joka on leikattu merkkijonosta alkaen määritetystä numerosta ja jos toinen numero on määritetty, merkkien lukumäärän |
string substring-before(string, string) | Jos toinen merkkijono löytyy ensimmäisestä, palauttaa merkkijonon toisen merkkijonon ensimmäiseen esiintymiseen asti |
string substring-after(string, string) | Jos toinen merkkijono löytyy ensimmäisestä, palauttaa merkkijonon toisen merkkijonon ensimmäisen esiintymisen jälkeen |
boolean starts-with(string, string) | Palauttaa true, jos toinen rivi on ensimmäisen alussa, muuten -false |
boolean ends-with(string, string) | Palauttaa true, jos toinen rivi on ensimmäisen lopussa, muuten -false |
string normalize-space(string?) | Poistaa ylimääräiset ja toistuvat välilyönnit sekä ohjausmerkit ja korvaa ne välilyönneillä |
string translate(string, string, string) | Korvaa ensimmäisen merkkijonon merkit, jotka esiintyvät toisessa merkkijonossa, kolmannen merkkijonon merkeillä, jotka vastaavat merkkien paikkoja toisessa merkkijonossa. Esimerkiksi se translate("bar", "abc", "ABC")palauttaa BAr. |
Symboli, operaattori | Merkitys |
---|---|
or | looginen "tai" |
and | looginen "ja" |
= | looginen "tasa-arvoinen" |
<(<) | looginen "vähemmän kuin" |
>(>) | looginen "suurempi" |
<=(<=) | looginen "pienempi tai yhtä suuri" |
>=(>=) | looginen "suurempi tai yhtä suuri" |
Toiminto | Kuvaus |
---|---|
boolean boolean(object) | Ohjaa objektin boolen tyyppiin |
boolean true() | Palauttaa totta |
boolean false() | Palauttaa epätosi |
boolean not(boolean) | Negaatio, palauttaa tosi, jos argumentti on epätosi ja päinvastoin |
Symboli, operaattori | Merkitys |
---|---|
+ | lisäys |
− | vähennyslasku |
* | kertolasku |
div | säännöllinen jako ( ei kokonaisluku! ) |
mod | divisioonan loppuosa |
Toiminto | Kuvaus |
---|---|
number number(object?) | Muuntaa objektin luvuksi |
number sum(node-set) | Palauttaa sarjan summan. Jokainen asetettu tunniste muunnetaan merkkijonoksi ja siitä saadaan numero |
number floor(number) | Palauttaa suurimman kokonaisluvun, joka ei ole suurempi kuin argumentti (pyöristys alas) |
number ceiling(number) | Palauttaa pienimmän kokonaisluvun, joka on vähintään argumentti (pyöristys ylöspäin) |
number round(number) | Pyöristää luvun matemaattisten sääntöjen mukaan |
Toiminto | Kuvaus |
---|---|
node-set document(object, node-set?) | Palauttaa parametrissa määritellyn asiakirjanobject |
string format-number(number, string, string?) | Muotoilee luvun toisessa parametrissa määritetyn mallin mukaan. Kolmas parametri määrittää huomioon otettavan nimetyn numeromuodon. |
string generate-id(node-set?) | Palauttaa merkkijonon, joka on yksilöllinen tunniste |
node-set key(string, object) | Palauttaa joukon määritetyllä avaimella (samanlainen kuin idtunnisteiden toiminto) |
string unparsed-entity-uri(string) | Palauttaa jäsentämättömän URI:n. Jos sellaista ei ole, se palauttaa tyhjän merkkijonon |
boolean element-available(string) | Tarkistaa, onko parametrissa määritetty elementti tai joukko saatavilla. Parametria käsitellään XPathina |
boolean function-available(string) | Tarkistaa, onko parametrissa määritetty toiminto käytettävissä. Parametria käsitellään XPathina |
object system-property(string) | Parametrit, jotka palauttavat järjestelmämuuttujia. Voi olla:
Jos käytetään tuntematonta parametria, funktio palauttaa tyhjän merkkijonon |
boolean lang(string) | Palauttaa true, jos nykyisellä tunnisteella on attribuutti xml: langtai jos tagin ylätasolla on attribuutti xml: langja se sisältää merkkijonoa vastaavan merkin |
Predikaatit ovat hakasulkeissa olevia loogisia lausekkeita, jotka on rakennettu samojen periaatteiden mukaan kuin valintalauseke. Lausekkeet, jotka eivät palauta loogista arvoa, vaan tyhjän elementtijoukon, katsotaan vääriksi. Lauseketta, joka palauttaa luvun, pidetään lausekkeena, joka vertaa lukua kohtaan position(). Kun predikaatteja on enemmän kuin yksi, jokainen niistä suodattaa suodatuksen tulokset edellisen predikaatin mukaan.
Nimitys | Kuvaus |
---|---|
* | Ilmaisee minkä tahansa nimen tai merkkijoukon määritetyllä akselilla, esimerkiksi: * - minkä tahansa lapsisolmun; @* - mikä tahansa ominaisuus |
$name | Muuttujan käyttäminen. name — muuttujan tai parametrin nimi |
[] | Lisävalintaehdot (tai osoitusaskelpredikaatti). Täytyy sisältää looginen arvo. Jos se sisältää numeerisen arvon, sen katsotaan olevan solmun järjestysnumero, joka vastaa tämän luvun etuliittämistä lausekkeellaposition()= |
{} | Jos sitä käytetään tunnisteen sisällä toisella kielellä (kuten HTML), XSLT-prosessori käsittelee aaltosulkeiden sisältöä XPathina. |
/ | Määrittää puun tason, eli erottaa osoitusvaiheet |
| | Yhdistää tuloksen. Eli yhden polun sisällä voit kirjoittaa useita jäsennyspolkuja merkin läpi |, ja tällaisen lausekkeen tulos sisältää kaiken, mitä jokin näistä poluista löytää |
Kyselykielet | |
---|---|
XSL | |
---|---|
World Wide Web Consortium (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Tuotteet ja standardit |
| ||||||||||||||
Organisaatiot |
| ||||||||||||||
PÄÄLLÄ |
| ||||||||||||||
Konferenssit |
|