Учебное пособие (1075724), страница 42
Текст из файла (страница 42)
Остальные строки таблицыформируются с помощью конструкции FLWOR:{let $ProcessorsDoc := doc(xrx_example:ProcessorsFileName())В переменную $ProcessorsDoc сохраняется XML-документ, содержащийданные о процессорах. Библиотечная функция xrx_example:ProcessorsFileName()возвращает путь и название документа, стандартная функция doc() по пути иназванию читает документ из БД.for $Processor in $ProcessorsDoc//processorПеребор всех элементов processor в документе. Здесь используется «//», а не«/», так как мы читаем не корневой элемент, а более глубоко вложенныеэлементы.let$id := xs:string($Processor/@id),$nm := xs:string($Processor/processor_name)Для каждого найденного процессора создаются связанные переменные (bindпеременные), содержащие id и наименование процессора.order by $nmСортировка по возрастанию по наименованию процессора.return<tr><td>{$nm}</td>{xrx_example:PathURI_edit_id_form($module_id, $module_ver,$id)}399{xrx_example:PathURI_delete_id_form($module_id, $module_ver,$id)}</tr>}Для каждого процессора возвращается строка HTML-таблицы (<tr>),содержащая три ячейки (<td>): первая содержит наименование процессора, втораяи третья содержат кнопки редактирования процессора и удаления процессора иформируются с помощью библиотечных функций.
Для второй и третьей ячеекэлементы <td> создаются внутри функций.Каждая функция принимает в качестве параметров название и версию модуля($module_id и $module_ver), которые нужны для формирования ссылок на другиеXQuery-сценарии модуля, и параметр $id, содержащий id процессора дляредактирования или удаления.</table></div>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Верхний заголовок :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowHeader() as node(){<div><table><tr>{xrx_example:PathURI_menu()}{xrx_example:PathURI_edit_new_form($module_id, $module_ver)}</tr></table><hr/></div>};Функция верхнего заголовка формирует две кнопки: кнопку возврата вглавное меню (xrx_example:PathURI_menu()) и кнопку добавления нового400элемента (xrx_example:PathURI_edit_new_form($module_id, $module_ver)), а такжегоризонтальный разделитель (<hr/>).(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Нижний заголовок :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowFooter() as node(){<div/>};Функция нижнего заголовка используется в качестве предварительнойзаготовки и возвращает пустой элемент <div/>.7.3.5.4.2 Сценарий edit_processor_1.2.xqlСценарий предназначен для вывода формы редактирования названияпроцессора и кнопок сохранения и отмены редактирования.Рис.
7.7. Сценарий edit_processor_1.2.xqlПролог сценария такой же, как в предыдущем случае:401xquery version "1.0";(: Импорт стандартных модулей :)declare namespace request="http://exist-db.org/xquery/request";declare namespace session="http://exist-db.org/xquery/session";(: Импорт модулей приложения :)import module namespace xrx_example ="http://iu5.bmstu.ru/edu/xrx_example" at "module.xqm";(: Формат, в котором результат должен отображаться в браузере :)declare option exist:serialize "method=xhtml media-type=text/htmlindent=no";(: Идентификатор модуля :)declare variable $module_id {"processor"};(: Версия модуля :)declare variable $module_ver {"1.2"};Основной запрос сценария:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основной запрос :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)let$newParam := xs:string(request:get-parameter("new","0")),$idParam := xs:string(request:get-parameter("id","0")),Функция request:get-parameter читает параметр HTTP-запроса.
Параметрможет быть задан в строке URL или передан из HTML-формы (читаютсяпараметры, переданные и с помощью метода GET, и с помощью метода POSTпротокола HTTP). Первый аргумент функции request:get-parameter – это имяHTTP-параметра, второй аргумент – значение по умолчанию, если параметр непередан на сервер.
Например, в случае request:get-parameter("new","0") функцияпытается найти HTTP-параметр "new" и вернуть его значение. Если параметр небыл передан, то возвращается "0".$DataSaveURI := xrx_example:PathURI_data_save($module_id,$module_ver),$DataListURI := xrx_example:PathURI_list($module_id, $module_ver),402Формирование URI (имен) XQuery-сценариев для сохранения данных иотображения списка данных, сохранение этих URI в соответствующиепеременные.$IdParam := xrx_example:PathURI_make_id_param($module_id, $idParam,$newParam),$NameParam := local:make_name_param($idParam, $newParam)Переменные $IdParam (id процессора) и $NameParam (наименованиепроцессора) содержат данные по умолчанию для редактирования в HTML-форме.Эти переменные формируются с помощью вспомогательных функций.return<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF8"/><style type="text/css"><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"href="{xrx_example:PathURI_current_css()}"/></style>Вставка стиля CSS с помощью XInclude, как в предыдущем сценарии.</head><body><h1>Справочник типов процессоров</h1>{ local:main($DataListURI, $DataSaveURI, $IdParam, $NameParam) }Вызов функции local:main(), выполняющей основные действия.</body></html>(: ++++++++++++++++++++++++++++++++++++++++++++++ :)Локальные функции (они располагаются между прологом и основнымзапросом):(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Форма редактирования :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)403declare function local:ShowForm($DataListURI as xs:string,$DataSaveURI as xs:string, $IdParam as xs:string, $NameParam asxs:string) as node(){<div><form method="post" action="{$DataSaveURI}">Форма редактирования данных.
Результаты заполнения формы будутотправлены серверному сценарию, название (URI) которого хранится впеременной $DataSaveURI.<table align="center" border="1"><tr><td>Тип процессора:</td><td><input type="hidden" name="id" value="{$IdParam}" /><input type="text" size="50" name="processor_name"value="{$NameParam}" />id процессора является скрытым полем (input type="hidden"), а наименованиепроцессора полем ввода (input type="text").Значения переменных $IdParam и $NameParam подставляются в форму вкачестве значений по умолчанию.То есть, когда HTML-форма будет сгенерирована, то в тэги формы будутвставлены значения по умолчанию в виде атрибутов value.Если бы мы использовали технологию XForms, то значения по умолчанию невставлялись бы в саму форму, но загружались бы из отдельного XQuery-сценария.</td></tr><tr><td colspan="2" align="center"><button type="submit">Сохранить</button><button type="button"onclick="window.location='{$DataListURI}'"> Отменить </button></td></tr>404В случае сохранения формы срабатывает стандартная кнопка типа «submit»,которая отправляет форму серверному сценарию, адрес которого указан ватрибуте action тэга form.В случае отмены редактирования, с использованием простого JavaScriptобработчика "window.location='{$DataListURI}'" мы загружаем в текущее окнобраузера XQuery-сценарий, который отображает список процессоров (адрес этогосценария хранится в переменной $DataListURI.</table></form></div>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Возвращает наименование для формы редактирования :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:make_name_param($idParam as xs:string,$newParam as xs:string) as xs:string{if($idParam != "0")then(xs:string(doc(xrx_example:ProcessorsFileName())//processor[@id=$idParam]/processor_name))else (xs:string(""))};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)Функция принимает два строковых параметра: $idParam (id элемента дляредактирования) и $newParam (признак нового элемента).В этой функции в качестве основной XQuery-конструкции используетсяконструкция IF.Если $idParam не содержит значение «0», то это режим редактирования.ТогдавXML-документе,содержащемпроцессоры,производитсяпоискпроцессора с заданным id и возвращается название процессора.
Иначе это режимдобавления нового элемента, и возвращается пустая строка.405Параметр $newParam в текущей версии функции не используется, но в случаеусложнения алгоритма проверки он, возможно, потребуется.Остальные функции сценария достаточно просты и не требуют пояснений:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Верхний заголовок :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowHeader() as node(){<div/>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Нижний заголовок :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowFooter() as node(){<div/>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основная функция :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:main($DataListURI as xs:string, $DataSaveURIas xs:string, $IdParam as xs:string, $NameParam as xs:string) asnode(){<div>{(local:ShowHeader()),(local:ShowForm($DataListURI, $DataSaveURI, $IdParam,$NameParam)),(local:ShowFooter())}</div>406};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)7.3.5.4.3 Сценарий data_processor_1.2.xqlСценарий предназначен для работы с данными.Пролог сценария стандартный.
Дополнительно содержит переменные$module_computer_id и $module_computer_ver для взаимодействия с модулемкомпьютера:xquery version "1.0";(: Импорт стандартных модулей :)declare namespace request="http://exist-db.org/xquery/request";declare namespace response="http://exist-db.org/xquery/response";declare namespace session="http://exist-db.org/xquery/session";(: Импорт модулей приложения :)import module namespace xrx_example ="http://iu5.bmstu.ru/edu/xrx_example" at "module.xqm";(: Формат в котором результат должен отображаться в браузере :)declare option exist:serialize "method=xhtml media-type=text/htmlindent=no";(: Идентификатор модуля :)declare variable $module_id {"processor"};(: Версия модуля :)declare variable $module_ver {"1.2"};(: Для вызова модуля компьютера :)declare variable $module_computer_id {"computer"};declare variable $module_computer_ver {"1.1"};ОсновнойзапроссценариянеформируетHTML-документ,каквпредыдущих случаях.















