XQuery
XQuery XQuery pozwala na wydobywanie danych z dokumentów XML w sposób podobny do tego w jaki używany jest SQL do tabel w bazach danych. XQuery to język do wykonywania zapytań na dokumentach XML. Pozwala znaleźć i pobrać elementy i ich atrybuty z dokumentów XML. XQuery wykorzystuje wyrażenia XPath. XQuery 1.0 i XPath 2.0 wykorzystują ten sam model danych i wspierają te same funkcje i operatory. XQuery jest wspierany przez większość baz danych XQuery jest rekomendacją W3C
XQuery - przykład for $x in doc("books.xml")/bookstore/book where $x/price>30 order by $x/title return $x/title
Hello world... Wyrażenie XQuery zwraca dokument XML Hello world <?xml version="1.0" encoding="utf-8"?> Hello world 2+2 <?xml version="1.0" encoding="utf-8"?> 4 current-time() <?xml version="1.0" encoding="utf-8"?> 11:25:19.517Z
XQuery Funkcja doc( ) jest wykorzystywana do otwarcia dokumentu XML. Jako parametr przyjmuje adres pliku. Do nawigacji po elementach XML wykorzystywane są wyrażenia XPath. doc("books.xml")/bookstore/book/title Pobranie wszystkich tytułów książek (wewnątrz znacznika bookstore będącego korzeniem drzewa)
"For, Let, Where, Order by, Return". FLWOR (czyt. flower ) - wyrażnie, które wspiera iterację i wiąże zmienne z pośrednimi wynikami. FLWOR może być porównane do SELECT - FROM - WHERE z języka SQL. For - tworzy sekwencję węzłów Let - wiąże węzły z sekwencji ze zmiennymi Where - filtruje węzły za pomocą wyrażeń logicznych Order by - sortuje węzły Return - zwraca uzyskany wynik dla każdego węzła
FLWOR - przykład Wybierz wszystkie książki: for $x in doc("books.xml")/bookstore/book których cena jest większa od 30 where $x/price>30 posortowane według tytułu order by $x/title zwróć ich tytuły return $x/title
Predykaty Predykaty mogą być wykorzystywane do ograniczenia wyświetlanych wyników. Możliwe jest wykorzystanie predykatów znanych z XPath, np. doc("books.xml")/bookstore/book[price<30] lub wykorzystanie klauzuli where : for $x in doc("books.xml")/bookstore/book where $x/price>30 return $x/title
Predykaty doc("osoby.xml")/osoby/osoba/imie[ends-with(., 'a')] for $x in doc("osoby.xml")/osoby/osoba/imie where ends-with($x, 'a') return $x
Pobranie danych z węzła return $x/title zwróci węzły title - w celu pobrania ich zawartości należy wykorzystać funkcję data( ) for $x in doc("books.xml")/bookstore/book where $x/price>30 order by $x/title return data($x/title)
Zmienne lokalne { } let $x := 1 let $y := "some other stuff" let $z := $x + 1 return ( <x>{$x}</x>, <y>{$y}</y>, <y>{$z}</y> ) <?xml version="1.0" encoding="utf-8"?> <x>1</x><y>some other stuff</y><y>2</y>
Wartościowanie wyrażeń Zwrócenie pojedynczej zmiennej powoduje automatycznie jej wartościowanie let $x := 1 return $x <?xml version="1.0" encoding="utf-8"?> 1 Zwrócenie więcej niż 1 węzła - nawiasy okrągłe oddzielone przecinkami Umieszczenie wyrażenia (znajdującego się w ciągu znakowym) wewnątrz nawiasów klamrowych {} spowoduje wartościowanie tego wyrażenia let $x := 1 let $y := "some other stuff" let $z := $x + 1 return (<x>{$x}</x>, <y>{$y}</y>, <z>$z</z>) <?xml version="1.0" encoding="utf-8"?> <x>1</x><y>some other stuff</y><z>$z</z>
Łączenie zapytań let $doc := doc("uczelnia.xml") for $stud in $doc/uczelnia/studenci/student, $kier in $doc/uczelnia/kierunki/kierunek where $stud/@kierunekref=$kier/@id return <li>{data($stud)} : {data($kier)}</li>
Funkcje XPath/XQuery node-name(x) nazwa węzła x nilled(x) zwraca prawdę jeśli argument jest pusty (nil) data(x) zawartość wszystkich węzłów tekstowych wewnątrz węzła x base-uri(x) document-uri(x)
Funkcje XPath/XQuery number(arg) - przekształca argument do liczby number('100') => 100 abs(num) - wartość bezwzględna abs(3.14) => 3.14 abs(-3.14) => 3.14 ceiling(num) - "sufit" ceiling(3.14) => 4 floor(num) - "podłoga" floor(3.74) => 3 round(num) - zaokrąglenie liczby do najbliższej liczby całkowitej round(3.14) => 3 round-half-to-even() - zaokrąglenie liczby *.5 do całkowitej liczby parzystej round-half-to-even(1.3) => 1 round-half-to-even(1.5) => 2 round-half-to-even(2.5) => 2 round-half-to-even(2.7) => 3
Funkcje XPath/XQuery string(arg) wartość argumentu przekształcona do stringa string(314) => "314" codepoints-to-string(int,int,...) zwraca stringa na podstawie sekwencji kodów ASCII codepoints-to-string(84, 104, 233, 114, 232, 115, 101) => 'Thérèse' string-to-codepoints(string) przekształca stringado dodów ASCII string-to-codepoints("thérèse") => 84, 104, 233, 114, 232, 115, 101 codepoint-equal(comp1,comp2) zwraca prawdę jeśli comp1 jest równe comp2 compare(comp1,comp2) zwraca -1 jeśli comp1 jets mniejsze niż comp2, 0 jeśli są równe, 1 jeśli comp1 jet większe niż comp2 compare('ala','ola') => -1 compare('ala','ala') => 0 compare('ola','ala') => 1
Funkcje XPath/XQuery concat(string,string,...) zwraca string będący połączeniem argumentów concat('xpath ','is ','FUN!') => 'XPath is FUN!' string-join((string,string,...),sep) łączy stringi za pomocą separatora sep string-join(('we', 'are', 'having', 'fun!'), ' ') => ' We are having fun! ' string-join(('we', 'are', 'having', 'fun!')) => 'Wearehavingfun!' substring(string,start,len), substring(string,start) zwraca podstring stringa, rozpoczynając od start o długości len (lub do końca stringa - jeśli len nie zdefiniowane) substring('beatles',1,4) => 'Beat' substring('beatles',2) => 'eatles'
Funkcje XPath/XQuery string-length(string) - długość stringa string-length('beatles') => 7 normalize-space(string) usuwa białe znaki na końcu i początku stringa, zastępuje wielokrotne białe znaki wewnątrz stringa pojedynczą spacją normalize-space(' The XML ') => 'The XML' upper-case(string), lower-case(string) konwertuje stringa do dużych/małych znaków upper-case('the XML') => 'THE XML' lower-case('the XML') => 'the xml' translate(s1,s2,s3) przekształca stringa s1 poprzez zastąpienie znaków należących do s2 odpowiadającymi im znakami s3 translate('10/11/2011-10:54','/-:','-.') => "10-11-2011 10.54" replace(string,pattern,replace) zwraca ciąg znaków utworzony poprzez zastąpienie wzorca pattern łańcuchem replace replace("bella Italia", "la", "*+") => "Bel*+ Italia"
Funkcje XPath/XQuery contains(string1,string2) zwraca prawdę jeśli string 1 zawiera string2 contains('xml','xm') => true contains('xslt','xm') => false starts-with(string1,string2), ends-with(string1,string2) zwraca prawdę jeśli string 1 zaczyna się/kończy się ciągiem znaków równym string2 starts-with('xml','x') => true ends-with('xml','x') => flase tokenize(string,pattern) dzieli string na tokeny, wykorzystując do podziału wzorzec pattern tokenize("xpath is fun", "\s+") => ("XPath", "is", "fun")
Funkcje logiczne boolean(arg) zwraca wartość logiczną na podstawie liczby, ciągu znaków lub zbioru węzłów true() zwraca wartość true false() zwraca wartość false not(arg) konwertuje argument do wartości logicznej i zwraca jego zaprzeczenie not(true()) => false not(-4) => false
Data/czas datetime(date,time) tworzy obiekt daty i czasu datetime(xs:date('2006-08-15'), xs:time('12:30:45-05:00')) year-from-datetime(), month-from-datetime(), day-from-datetime(), hours-fromdatetime(), minutes-from-datetime(), seconds-from-datetime() zwraca poszczególne komponenty daty seconds-from-datetime(xs:datetime('2006-08-15t10:30:23')) => 23
Data/czas days-from-duration(d), hours-from-duration(d), minutes-from-duration(d), secondsfrom-duration(d) zwraca okres czasu przekształcony odpowiednio do liczby dni, godzin itd. minutes-from-duration( xs:daytimeduration('p1dt36h15m') ) => 15 days-from-duration( xs:daytimeduration('p1dt36h15m') ) => 2 minutes-from-duration( xs:daytimeduration('p1dt36h90m') ) => 90 Konstruktor xs:daytimeduration('padtbhcmds') a dni, b godzin, c minut, d sekund
Data/czas months-from-duration(xs:yearmonthduration), years-fromduration(xs:yearmonthduration) liczba miesięcy/lat w danym okresie czasu months-from-duration(xs:yearmonthduration('p1y20m')) => 8 years-from-duration(xs:yearmonthduration('p1y20m')) => 2 Konstruktor xs:yearmonthduration('paybm') a lat, b miesięcy
Data/czas adjust-date-to-timezone(date,timezone), adjust-time-totimezone(time,timezone) zwraca datę lub czas dla określonej strefy czasowej adjust-date-to-timezone(xs:date('2006-02-15-03:00'), xs:daytimeduration('- PT8H')) => 2006-02-14-08:00 adjust-time-to-timezone(xs:time('17:00:00-03:00'), xs:daytimeduration('- PT7H')) => 13:00:00-07:00
Funkcje statystyczne count((item,item,...)) zwraca liczbę elementów count((1,2,3)) => 3 avg((arg,arg,...)) zwraca średnią ze zbioru elementów avg((1,2,3,4)) 2.5 max((arg,arg,...)), min((arg,arg,...)) zwraca wartość maksymalną/minimalną z podanego zbioru max((1,2,3)) => 3 max(('a', 'm','k')) => 'm' min((1,2,3)) => 1 max(('a', 'm','k')) => 'a' sum(arg,arg,...) zwraca sumę (numeryczną) wartości wszystkich węzłów