Определение переменных
В прологе можно дать определение глобальных переменных, используемых потом в выражениях-запросах. При определении указывается имя переменной и ее значение, задаваемое произвольным выражением. Кроме того, после предлога as можно указать тип переменной, если он отличается от типа выражения. При этом типы переменной и выражения должны быть совместимы. Например:
define variable $x (-3.5)
define variable $n as xs:integer (-3)
Импорт модуля
Кроме главного модуля, в языке XQuery существуют библиотечные модули (library module), состоящие только из пролога. Они отмечаются словом module, за которым записывается целевое пространство имен модуля и его пролог. Целевое пространство имен модуля будет пространством имен по умолчанию для имен переменных и функций, определенных в модуле. Например:
module "http://some.domain/module1"
import schema namespace ipo ="http://some.domain/IPO"
import schema namespace zips="http://some.domain/zips"
define function zip-ok($a as element(*, ipo:USAddress)) as xs:boolean {
some $i in doc("zips.xml")/zips:zips/element(zips:row)
satisfies $i/zips:city = $a/city
and $i/zips:state = $a/state
and $i/zips:zip == $a/zip
}
Определения, сделанные в библиотечном модуле, можно импортировать в другой модуль, записав в этом, другом, модуле оператор импорта, имеющий вид:
import module "http://some.domain/modulel"
at "http://some.domain/modulel.xqr"
В операторе импорта указывается целевое пространство имен библиотечного модуля. После предлога at строкой URI указывается местоположение модуля. Эту часть оператора можно опустить, если есть какой-то другой способ указать расположение модуля.
Целевое пространство имен модуля можно сразу снабдить префиксом:
import module namespace xyz = http://some.domain/modulel
at "http; //some. domain/module1. xqr"
Пример главного модуля
Итак, в общем виде запись на языке XQuery, образующая главный модуль, состоит из пролога и выражения, которым чаше всего служит выражение-запрос. Вот пример главного модуля, взятый из документации XQuery. В нем определена функция names-match(), проверяющая совпадение имен, заданных ее аргументами. Эта функция применяется в запросе for для отбора узлов с несовпадающими именами:
import schema namespace ipo="http://www.example.com/IPO"
define function names-match(
$s as element(ipo:purchaseOrder/shipTo),
$b aa elf.iment (ipo:purchaseOrder/billTo)
) as xs:boolean
{
$s/name=$b/name
}
for $p in doc("ipo.xml")//element(ipo:purchaseOrder)
where not(names-match($p/shipTo,$p/billTo))
return $p
Достарыңызбен бөлісу: |