Funkcje XQuery

XQuery 1.0, XPath 2.0 oraz XSLT 2.0 dzielą ten sam zestaw funkcji.

Funkcje XQuery

XQuery zawiera ponad 100 wbudowanych funkcji. Te funkcje można używać do operacji na wartościach ciągów, liczb, dat i czasu, operacji na węzłach i QName, operacji na sekwencjach, wartości logicznych itp. Można również zdefiniować własne funkcje w XQuery.

Wbudowane funkcje XQuery

URI przestrzeni nazw funkcji XQuery:

http://www.w3.org/2005/02/xpath-functions

Domyślny prefiks przestrzeni nazw funkcji to fn:.

Wskazówka:Funkcje są często wywoływane za pomocą prefiksu fn:, np. fn:string(). Jednakże, ponieważ fn: jest domyślnym prefiksem przestrzeni nazw, nazwa funkcji nie musi być używana jako prefiks podczas wywoływania.

Pełna wersja "XPath Tutorial" znajduje się w naszej:Podręcznik referencyjny wbudowanych funkcji XQuery》。

Przykład wywołania funkcji

Wywołanie funkcji można połączyć z wyrażeniami. Patrz poniżej za przykładem:

Przykład 1: w elemencie

<name>{upper-case($booktitle)}</name>

Przykład 2: w predykatach wyrażenia ścieżki

doc("books.xml")/bookstore/book[substring(title,1,5)='Harry'

Przykład 3: w zdaniu let

let $name := (substring($booktitle,1,4))

Funkcje użytkownika XQuery

Jeśli nie można znaleźć wymaganej funkcji XQuery, można napisać własną funkcję.

Funkcje użytkownika można zdefiniować w zapytaniu lub w oddzielnym bibliotece.

Gramatyka

declare function prefiks:nazwa_funkcji($parametr AS typ_danych)
  AS typ danych zwracanych
{}}
(: ...kod funkcji... :)
;

Uwagi dotyczące funkcji użytkownika zdefiniowanych przez użytkownika:

  • Użyj klucza declare function
  • Nazwa funkcji musi zawierać prefiks
  • Typ danych parametrów zazwyczaj jest zgodny z typem danych zdefiniowanym w XML Schema
  • Ciało funkcji musi być otoczone klamrami

Przykład funkcji użytkownika w zapytaniu:

declare function local:minPrice(
  $price as xs:decimal?,
  $discount as xs:decimal?)
  AS xs:decimal?
{}}
let $disc := ($price * $discount) div 100
return ($price - $disc)
;
(Poniżej znajduje się przykład wywołania powyższej funkcji :)
<minPrice>{local:minPrice($book/price, $book/discount)}</minPrice>