Учебное пособие (1075724), страница 44
Текст из файла (страница 44)
По структуре он очень похож нарассмотренный ранее сценарий вывода списка процессоров.Рис. 7.9. Сценарий list_computer_1.1.xql417Текст сценария:xquery 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 {"computer"};(: Версия модуля :)declare variable $module_ver {"1.1"};Переменные, содержащие идентификатор и версию для модуля компьютера.(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Вывод данных в виде списка :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowList() as node(){<div><table align="center" border="1"><tr><th>Компьютер</th><th colspan="2">Действия</th></tr>{let $ComputersList :=collection(xrx_example:PathURI_data_list_in_db($module_id))for $Computer in $ComputersList//computerlet$id :=xs:string($Computer/@id),418$ComputerNm := xs:string($Computer/computer_name)order by $ComputerNmreturn<tr><td>{$ComputerNm}</td>{xrx_example:PathURI_edit_id_form($module_id, $module_ver,$id)}{xrx_example:PathURI_delete_id_form($module_id,$module_ver, $id)}</tr>}</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>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Нижний заголовок :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:ShowFooter() as node(){<div/>};419(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основная функция :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:main() as node(){<div>{(local:ShowHeader()),(local:ShowList()),(local:ShowFooter())}</div>};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основной запрос :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)let $CurrentCssURI := xrx_example:PathURI_current_css()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="{$CurrentCssURI}"/></style></head><body><h1>Справочник компьютеров</h1>{ local:main() }</body></html>(: ++++++++++++++++++++++++++++++++++++++++++++++ :)7.3.5.5.2 Сценарий edit_computer_1.1.xql420Сценарий предназначен для вывода формы редактирования компьютера икнопок сохранения и отмены редактирования.
Сценарий генерирует XHTMLдокумент, в котором находится XForms -форма.Рис. 7.10. Сценарий edit_computer_1.1.xqlПролог сценария:xquery 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";(: Формат, в котором результат должен отображаться в браузере :)421declare option exist:serialize "method=xhtml media-type=text/htmlindent=no";(: Идентификатор модуля :)declare variable $module_id {"computer"};(: Версия модуля :)declare variable $module_ver {"1.1"};(: Для вызова модуля процессора :)declare variable $module_processor_id {"processor"};declare variable $module_processor_ver {"1.2"};Пролог содержит переменные $module_processor_id и $module_processor_verдля взаимодействия с модулем процессора.Основной запрос сценария:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основной запрос :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Если не заполнен справочник типов процессоров, то редактированиекомпьютеров невозможно (нет данных для выпадающего спискапроцессоров) :)if (xrx_example:ModuleDataCount($module_processor_id,$module_processor_ver) = 0)then(: Вывод сообщения об ошибке :)(xrx_example:ShowErrorButton("Невозможно редактировать данные окомпьютере пока не заполнен справочник типов процессоров","Вернуться в главное меню", $xrx_example:MainScript))Перед генерацией формы ввода данных о компьютере необходимопроверить, что существуют данные в справочнике типов процессоров.
Если этотсправочник пустой, то отсутствуют данные для выпадающего списка типовпроцессоров и это приведет к возникновению ошибки в XForms-процессоре.422Поэтому, если справочник типов процессоров не заполнен, то выводитсясообщение об ошибке и кнопка возврата, иначе выполняются основные действияпо генерации формы.else(: Выполнение основных действий :)(let$newParam := xs:string(request:get-parameter("new","0")),$idParam := request:get-parameter("id","0"),$DataReadURI := xrx_example:PathURI_data_edit($module_id,$module_ver, $idParam, $newParam),$DataPreSaveURI := xrx_example:PathURI_data_presave($module_id,$module_ver),$DataSaveURI := xrx_example:PathURI_data_save($module_id,$module_ver),$ListURI := xrx_example:PathURI_list($module_id, $module_ver),$ProcessorReadURI :=xrx_example:PathURI_data_list($module_processor_id,$module_processor_ver),$DataNewUpgradeURI := concat(xrx_example:PathURI_data($module_id,$module_ver), "?newupgrade=1"),$CurrentCssURI := xrx_example:PathURI_current_css(),$XFormsCssURI := xrx_example:PathURI_xforms_css(),ЧтениепараметровиформированиевспомогательныхURI.Далееформируется XHTML-документ, содержащий XForms-форму.$form :=<html xmlns="http://www.w3.org/1999/xhtml"xmlns:xforms="http://www.w3.org/2002/xforms"xmlns:ev="http://www.w3.org/2001/xml-events"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF8"/><style type="text/css"><!-- Добавление стилей CSS с помощью XInclude -->423<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"href="{$CurrentCssURI}"/><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"href="{$XFormsCssURI}"/></style><!-- Модель создается в секции head -->{ local:CreateXFormsModels($DataReadURI, $DataSaveURI,$ProcessorReadURI, $DataNewUpgradeURI, $DataPreSaveURI) }Вызов функции, которая создает модели данных XForms-формы в секцииHEAD XHTML-документа.</head><body><h1>Справочник компьютеров</h1><!-- Поля редактирования формы -->{ local:EditForm($ListURI, $DataPreSaveURI, $DataSaveURI) }Вызов функции, которая создает поля ввода данных XForms-формы в секцииBODY XHTML-документа.</body></html>(: сгенерированный XForms-документ обрабатывается с помощью XSLTпреобразования для получения HTML-документа :)return xrx_example:transform_xsltforms($form))СгенерированныйXHTML-документ сохраняетсявовспомогательнуюпеременную $form.
Далее его необходимо преобразовать с использованием XSLTпреобразования,котороеявляетсяосновнойчастьюXForms-процессораXSLTForms. Это преобразование можно было сделать в браузере, но здесь оноделается в серверном сценарии и в браузер передается результат преобразования ввиде HTML-документа.В этом сценарии всего две локальных функции, которые генерируют модельданных формы и поля ввода формы:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)424(: Модели данных формы :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:CreateXFormsModels($DataReadURI as xs:string,$DataSaveURI as xs:string, $ProcessorReadURI as xs:string,$DataNewUpgradeURI as xs:string, $DataPreSaveURI as xs:string) asnode()*{((: Основная модель данных :)<xforms:model id="computer_model">Основная модель данных «computer_model» содержит информацию одобавляемом или редактируемом компьютере и его обновлениях.<!-- Основные данные (о компьютере) --><xforms:instance id="computer_instance" xmlns=""src="{$DataReadURI}"/>Инстансформы«computer_instance»содержитXML-элемент,соответствующий данным о компьютере.
Данные читаются из XQuery-сценария,название которого хранится в переменной $DataReadURI. В случае добавленияданных в эту переменную помещается URI сценария, который возвращаетнезаполненный XML-элемент для ввода новых данных. В случае редактированияданных в эту переменную помещается URI сценария, который возвращает данныео компьютере из БД на основе id компьютера.Атрибут «xmlns=""» означает, что пространства имен в данных неиспользуются (используется «пустое» пространство имен).<!-- Данные для добавления нового обновления --><xforms:instance id="upgrade_instance" xmlns=""src="{$DataNewUpgradeURI}"/>Инстанс «upgrade_instance» содержит XML-данные, соответствующие одноймодернизации, этот инстанс используется при добавлении новой модернизации.Далее следуют элементы xforms:bind, которые описывают ограничения дляXML-элементов данных.
Атрибут nodeset задает название элемента данных (ввиде XPath-выражения), атрибут required определяет обязательные элементы425(которые не могут быть пустыми), атрибут type задает тип данных элемента,атрибут constraint задает ограничение на значение данных.Особенностью текущей версии XSLTForms является то, что для одногоэлемента данных можно определить только один элемент xforms:bind. Нельзя,например, задать для одного элемента данных два xforms:bind и в одном указатьатрибут required, а в другом атрибут constraint, все атрибуты необходимосгруппировать в одном элементе xforms:bind.<!-- Наименование компьютера - обязательное поле и введенныеданные не состоят только из пробелов --><xforms:bind nodeset="//computer_name" required="true()"constraint="string-length(normalize-space(.)) > 0" />Атрибут required="true()" означает, что поле обязательно для ввода.По умолчанию тип данных элемента – строка.















