Учебное пособие (1075724), страница 50
Текст из файла (страница 50)
:)(: Импорт стандартных модулей :)declare namespace request="http://exist-db.org/xquery/request";declare namespace session="http://exist-db.org/xquery/session";declare namespace xdb="http://exist-db.org/xquery/xmldb";(: Базовый путь к приложению :)declare variable $xrx_example:BasePath {"/db/iu5/xrx_example/"};(: Коллекции в базовом пути, используются при инициализации БД :)declare variable $xrx_example:BasePath_db {"/db"};declare variable $xrx_example:BasePath_iu5 {"iu5"};declare variable $xrx_example:BasePath_db_iu5 {"/db/iu5/"};declare variable $xrx_example:BasePath_xrx_example {"xrx_example"};(: Наименование файла данных для процессоров :)declare variable $xrx_example:FileName_processors{"processors.xml"};(: Наименование файла для отладочных сообщений :)declare variable $xrx_example:FileName_log {"log.xml"};(: Наименование основного сценария :)declare variable $xrx_example:MainScript {"index.xql"};(: Базовый путь к XSLTForms :)declare variable $xrx_example:BaseXSLTFormsPath{"http://localhost:8080/exist/xforms/xsltforms/"};(: Путь к XSLT-преобразованию в XSLTForms :)declare variable $xrx_example:XSLTFormsFile {fn:concat($xrx_example:BaseXSLTFormsPath, "xsltforms.xsl") };484(: +++++++++++++++++++++++++++++++++++++++ :)(: Функции для работы с XForms :)(: +++++++++++++++++++++++++++++++++++++++ :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Преобразование XForms-формы в HTML с помощью XSLT-преобразования:)(: Не требуется специальных настроек eXist, не требуетсяпреобразований в браузере :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:transform_xsltforms($xhtmldoc asnode()) as node()*{(: Параметры преобразования :)let$XSLTFile := xs:anyURI($xrx_example:XSLTFormsFile),(: В качестве параметра преобразования необходимо указать базовыйпуть к XSLTForms,иначе преобразование генерирует неправильные пути в HTML(неправильно генерируются пути к файлам JavaScript и т.д.) :)$params :=<parameters><param name="baseuri"value="{$xrx_example:BaseXSLTFormsPath}"/></parameters>(: XSLT-преобразование, возвращается HTML-документ :)let $TransformRes := transform:transform($xhtmldoc, $XSLTFile,$params)return $TransformRes};(: +++++++++++++++++++++++++++++++++++++++++++++ :)(: Функции для работы с коллекциями и сценариями :)(: +++++++++++++++++++++++++++++++++++++++++++++ :)485(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Переход на заданный URI :)(: Позволяет из одного XQuery-сценария переходить на другой XQueyсценарий :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:redirect($uri_str as xs:string) asempty(){let $uri := xs:anyURI($uri_str)return response:redirect-to($uri)};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает путь к коллекции, соответствующей модулю :)(: К названию модуля добавляется буква "s" :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare functionxrx_example:PathURI_data_list_in_db_not_basepath($module_id asxs:string) as xs:string{let $Result := concat($module_id, "s")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает полный путь к коллекции, соответствующей модулю :)(: Базовый путь к приложению объединяется с результатом предыдущейфункции :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data_list_in_db($module_id asxs:string) as xs:string{let $Result := concat($xrx_example:BasePath,xrx_example:PathURI_data_list_in_db_not_basepath($module_id), "/")return $Result};486(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Название файла, содержащего справочник процессоров :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:ProcessorsFileName() as xs:string{let $Result :=concat(xrx_example:PathURI_data_list_in_db("processor"),$xrx_example:FileName_processors)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Выделение из URL части, содержащей название сценария :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:FileNameFromURL($param as xs:string) asxs:string{let $delim := "/"return(: Если текущий адрес содержит "/", то функция вызываетсярекурсивно,параметром является то, что стоит справа от "/".
То есть от URLпостепенно отделяются названия каталогов, которые соединены междусобой "/".Рекурсивный вызов является заменой цикла while.:)if(fn:contains($param,$delim))then (xrx_example:FileNameFromURL(fn:substringafter($param,$delim)))(: Возвращается название сценария, которое не содержит "/" :)else ($param)};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Получение текущего URL :)487(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:CurrentURL() as xs:string{let $Result := xs:string(session:encode-url(request:get-uri()))return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Получение названия сценария из текущего URL :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:FileNameFromCurrentURL() as xs:string{let $Result := xrx_example:FileNameFromURL(xrx_example:CurrentURL())return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Получение базового URL :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:BaseURL($url as xs:string) as xs:string{let$FileName := xrx_example:FileNameFromURL($url),$FNLen := string-length($FileName),$Result := substring($url, 1, string-length($url)-$FNLen)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Получение базового URL из текущего URLrequest:get-url() возвращает полный адрес, начиная с http :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:BaseCurrentURL() as xs:string{let $Result := xrx_example:BaseURL(request:get-url())return $Result488};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает строку, содержащую версию модуля :)(: Функция используется для генерации путей к сценариям.Если указана версия модуля, то функция возвращает подчеркивание иверсию модуля,иначе пустую строку :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:module_ver_str($module_ver asxs:string) as xs:string{if($module_ver != "")then (concat("_", $module_ver))else ("")};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который выводит список :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_list($module_id as xs:string,$module_ver as xs:string) as xs:string{let $Result := concat("list_", $module_id,xrx_example:module_ver_str($module_ver), ".xql")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария редактирования :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_edit($module_id as xs:string,$module_ver as xs:string) as xs:string{let $Result := concat("edit_", $module_id,xrx_example:module_ver_str($module_ver), ".xql")489return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который работает с данными :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data($module_id as xs:string,$module_ver as xs:string) as xs:string{let $Result := concat("data_", $module_id,xrx_example:module_ver_str($module_ver), ".xql")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который сохраняет данные :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data_save($module_id asxs:string, $module_ver as xs:string) as xs:string{let $Result := concat(xrx_example:PathURI_data($module_id,$module_ver), "?save=1")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который подготавливает данные длясохранения :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data_presave($module_id asxs:string, $module_ver as xs:string) as xs:string{let $Result := concat(xrx_example:PathURI_data($module_id,$module_ver), "?presave=1")return $Result};490(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который возвращает список данных :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data_list($module_id asxs:string, $module_ver as xs:string) as xs:string{let $Result := concat(xrx_example:PathURI_data($module_id,$module_ver), "?list=1")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает URI сценария, который возвращает набор данных поумолчанию(Используется только с XForms, так как набор данных нужногенерировать в отдельном сценарии и передавать в форму) :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_data_edit($module_id asxs:string, $module_ver as xs:string, $idParam as xs:string,$newParam as xs:string) as xs:string{let $MainPath := concat("data_", $module_id,xrx_example:module_ver_str($module_ver), ".xql?")returnif($idParam != "0")then ( concat($MainPath, "id=", $idParam) )else ( concat($MainPath, "new=1") )};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает id параметр для формы редактирования (используется безXForms) :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)491declare function xrx_example:PathURI_make_id_param($module_id asxs:string, $idParam as xs:string, $newParam as xs:string) asxs:string{if($idParam != "0")then ($idParam)else (xs:string("new"))};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Генерация формы на переход к просмотру списка :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_list_form($module_id asxs:string, $module_ver as xs:string) as node(){<form method="post" action="{xrx_example:PathURI_list($module_id,$module_ver)}"><td><button type="submit">Вернуться к списку</button></td></form>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Генерация формы для возврата в главное меню :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_menu() as node(){<form method="post" action="{$xrx_example:MainScript}"><td><button type="submit">Вернуться в главное меню</button></td></form>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)492(: Генерация формы на добавление элемента по названию модуля :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_edit_new_form($module_id asxs:string, $module_ver as xs:string) as node(){<form method="post" action="{xrx_example:PathURI_edit($module_id,$module_ver)}"><td><input type="hidden" name="new" value="1" /><button type="submit">Добавить новый элемент</button></td></form>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Генерация формы на редактирование элемента по названию модуля :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_edit_id_form($module_id asxs:string, $module_ver as xs:string, $id as xs:string) as node(){<form method="post" action="{xrx_example:PathURI_edit($module_id,$module_ver)}"><td><input type="hidden" name="id" value="{$id}" /><button type="submit"title="Редактировать">Редактировать</button></td></form>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Генерация формы на удаление элемента по названию модуля :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_delete_id_form($module_id asxs:string, $module_ver as xs:string, $id as xs:string) as node(){493<form method="post" action="{xrx_example:PathURI_data($module_id,$module_ver)}"><td><input type="hidden" name="deleteid" value="{$id}" /><button type="submit" title="Удалить">Удалить</button></td></form>};(: +++++++++++++++++++++++++++++++++++++++++++++ :)(: Функции для работы с файлами CSS :)(: +++++++++++++++++++++++++++++++++++++++++++++ :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает путь к основному файлу CSS :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_current_css() as xs:string{let $Result := concat(xrx_example:BaseCurrentURL(),"styles/style.css")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает путь к файлу CSS для XForms :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:PathURI_xforms_css() as xs:string{let $Result := concat(xrx_example:BaseCurrentURL(),"styles/xforms.css")return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Выдача короткого сообщения об ошибке :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)494declare function xrx_example:ShowErrorButton($Error_message asxs:string, $Button_text as xs:string, $Button_uri as xs:string) asnode(){let $CurrentCssURI := xrx_example:PathURI_current_css()return<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF8"/><style type="text/css"><!-- Добавление стилей CSS с помощью XInclude --><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"href="{$CurrentCssURI}"/></style></head><body><table align="center" border="1"><tr><td><h2>Ошибка</h2></td></tr><tr><td><p>{$Error_message}</p></td></tr>{if($Button_text != "" and $Button_uri != "")then(<tr><td align="center"><form method="post" action="{$Button_uri}"><button type="submit">{$Button_text}</button>495</form></td></tr>)else ()}</table></body></html>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Выдача сообщения об ошибке при работе с формой :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:ShowError($module_id as xs:string,$module_ver as xs:string, $message as xs:string, $return_form asxs:boolean, $Errors as node()*) as node(){let $CurrentCssURI := xrx_example:PathURI_current_css()return<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF8"/><style type="text/css"><!-- Добавление стилей CSS с помощью XInclude --><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"href="{$CurrentCssURI}"/></style></head><body><table align="center" border="1"><tr><td><h2>{$message}</h2></td>496</tr><tr><td><p><b>Список ошибок:</b></p><div>{$Errors}</div></td></tr><tr><td align="center"><form method="post"action="{xrx_example:PathURI_list($module_id, $module_ver)}">{if($return_form)then(<button type="button" onclick="history.back()">Возврат кредактированию</button>)else()}{if($module_id != "")then(<button type="submit">Отменить</button>)else ()}</form></td></tr></table></body></html>};497(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Выдача сообщения об ошибке при работе с формой :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:ShowErrorReturnList($module_id asxs:string, $module_ver as xs:string, $message as xs:string, $Errorsas node()*) as node(){let $Result := xrx_example:ShowError($module_id, $module_ver,$message, fn:false(), $Errors)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Выдача сообщения об ошибке и возврат в список :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:ShowErrorReturnForm($module_id asxs:string, $module_ver as xs:string, $message as xs:string, $Errorsas node()*) as node(){let $Result := xrx_example:ShowError($module_id, $module_ver,$message, fn:true(), $Errors)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Функции для работы с идентификаторами :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Создание уникального идентификатора на основе текущей даты :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:MakeUniqueNow() as xs:string{let$now := fn:current-dateTime(),$year := xs:string(fn:year-from-dateTime($now)),498$month := xs:string(fn:month-from-dateTime($now)),$day := xs:string(fn:day-from-dateTime($now)),$h := xs:string(fn:hours-from-dateTime($now)),$m := xs:string(fn:minutes-from-dateTime($now)),$s := xs:string(fn:seconds-from-dateTime($now)),$sr := replace($s, "\.", "F"),$Result := concat($year, "_", $month, "_", $day, "_", $h, "_", $m,"_", $sr)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Создание уникального идентификатора :)(: Идентификатор создается как объединение стандартного уникальногоидентификатора (функция util:uuid())и уникального идентификатора на основе текущей даты (функцияxrx_example:MakeUniqueNow()) :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:MakeUniqueName() as xs:string{let$id := util:uuid(),$nowstr := xrx_example:MakeUniqueNow(),$Result := concat($id, "_" , $nowstr)return $Result};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Создание названия файла на основе уникального идентификатора :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function xrx_example:MakeUniqueFileNameExtXml($id asxs:string) as xs:string{let $Result := concat($id, ".xml")return $Result};499(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Функции для работы с данными и коллекциями :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Количество элементов в модуле :)(: Функция работает и в том случае, когда элементы хранятся вотдельных файлах,и в том случае, когда элементы хранятся в одном файле.Это достигается за счет использования запроса вида"коллекция//название элемента".Выражение "//" позволяет "пропустить" название файла, корневойэлемент файла и т.д.














