Функции в XQuery

XQuery 1.0, XPath 2.0 и XSLT 2.0 делят одинаковый функциональный каталог.

Функции в XQuery

XQuery содержит более 100 внутренних функций. Эти функции могут быть использованы для строковых значений, числовых значений, сравнения дат и времени, операций с узлами и QName, операций с последовательностями, логических значений и т.д. Вы также можете определить свои собственные функции в XQuery.

Внутренние функции XQuery

URI пространства имён функций XQuery:

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

Префикс по умолчанию для пространства имён функций - fn:.

Совет:Функции часто вызываются с префиксом fn:, например fn:string(). Однако, так как fn: является именем пространства имён по умолчанию, имя функции не обязательно должно указываться с префиксом при вызове.

Вы можете найти полную информацию о XPath в нашем курсе:Руководство по内置 XQuery функции»).

Пример вызова функции

Вызов функции может быть использован вместе с выражением. См. следующий пример:

Пример 1: В элементе

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

Пример 2: В predicate выражении пути

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

Пример 3: В предложении let

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

Пользовательские функции XQuery

Если找不到 необходимую функцию XQuery, вы можете написать свою собственную функцию.

Пользовательские функции можно определить в запросе или в отдельной библиотеке.

Грамматика

declare function префикс:имя_функции(参数 AS тип_данных)
  AS тип данных возвращаемых данных
{
(: ...код функции... :)
;

Внимание при работе с пользовательскими функциями:

  • Используйте ключевое слово declare function
  • Имя функции должно начинаться с префикса
  • Тип данных параметра обычно совпадает с типом данных, определенным в XML Schema
  • Основной блок функции окружен фигурными скобками

Пример пользовательской функции, объявленной в запросе:

declare function local:minPrice(
  $price as xs:decimal?,
  $discount as xs:decimal?
  AS xs:decimal?
{
let $disc := ($price * $discount) div 100
return ($price - $disc)
;
(Ниже приведен пример вызова функции)
<minPrice>{local:minPrice($book/price, $book/discount)}</minPrice>