Учебное пособие (1075724), страница 25
Текст из файла (страница 25)
Вдальнейших примерах он не используется.5.3.5 Преобразование XML-схем в XForms-формыСуществуютпродукты(библиотеки),предназначенныедляавтоматизированного преобразования XML-схем в XForms-формы.1. Библиотека XSDTransformer (http://xsdtrans.sourceforge.net).2.
Библиотека XSLTKit (http://xsltkit.sourceforge.net).Все средства вызываются из консоли и преобразуют файл XML-схемы вформу XForms.Библиотеки XSDTransformer и XSLTKit представляют собой XSLTпреобразования для решения различных задач. В том числе это задачапреобразования XML-схемы в документ XForms.Однако, такие продукты применяются не очень часто по следующимпричинам. Во-первых, они обычно генерируют «полуфабрикат» формы, которыйнеобходимо исправлять вручную, во-вторых, задача генерации формы на основесхемы может встречаться достаточно редко.5.3.6 Microsoft InfoPathMicrosoft InfoPath является альтернативой технологии XForms. Позволяетсоздавать формы ввода, вводить данные и сохранять данные в формате XML.Технология XForms при этом не используется. Формы хранятся вспециальном формате «Microsoft InfoPath».2375.4 Работа с примерами в этой главеВ этой главе все примеры XForms-форм созданы в виде документов XHTML.Это связано с тем, что XForms не является самостоятельным языком разметки, ноXForms-форма должна быть встроена в основной документ (host document),который разработан на основном языке разметки (host language).
Здесь в качествеhost-языка используется XHTML.Примеры в этой главе ориентированы на использование XForms-процессораbetterFORM.Для запуска примеров необходимо:1. Скачать и установить процессор betterFORM (http://www.betterform.de).Рекомендуется использовать дистрибутив в виде веб архива (.war) и установитьего на Apache Tomcat. Веб-приложение будет установлено в каталог «betterform».2. Каталог с примерами этой главы «xforms_examples» скопировать вподкаталог«forms» каталога«betterform» (например,путьможетбыть«C:\tomcat\webapps\betterform\forms»).3. Запустить веб-сервер Apache Tomcat и обратиться к примерам по адресу«http://localhost:8080/betterform/jsp/forms.jsp?forms/xforms_examples».Далееможно выбирать необходимый пример.5.5 Базовые примеры XForms-формПример 5.1.
Файл «input_output.xhtml».<?xml version="1.0" encoding="UTF-8"?><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" >Пространством имен по умолчанию является пространство имен дляXHTML-документов «http://www.w3.org/1999/xhtml».ТакжеобъявляетсяпространствоимендляXForms–xmlns:xforms="http://www.w3.org/2002/xforms". В качестве префикса пространстваимен обычно используется «xforms» или «xf».238Пространствоименxmlns:ev="http://www.w3.org/2001/xml-events"используется в том случае, когда необходимо создавать динамические формы среакцией на события (например, нажатие на кнопку).В этом примере события не используются (стандартная кнопка отправкиформы не требует использования событий).<head><title>Пример ввода и вывода значения</title><!-- Пустой префикс пространства имен обязателен длякорневого элемента xforms:instance --><xforms:model>Элемент «xforms:model» объявляет модель данных формы.
Модель данныхформы объявляется в секции HEAD документа XHTML.Модель может содержать:1. Экземпляры данных (xforms:instance).2. Ограничения на данные (xforms:bind).3. Способы отправки заполненных данных на сервер (xforms:submission).<xforms:instance xmlns="">Элемент «xforms:instance» объявляет экземпляр данных.В этом примере экземпляр данных непосредственно вложен в элемент«xforms:instance». С помощью атрибута «src=URI экземпляра данных» элемента«xforms:instance» можно загружать экземпляр данных из внешнего URI(например, из серверного сценария).Атрибут «xmlns=""» указывает, что для данных используется «пустое»пространство имен (то есть в экземпляре данных не используются пространстваимен).<example><text/></example>Экземплярданныхсодержиткорневойэлементэкземпляраданных«example» и элемент данных «text», который в дальнейшем будет связан с полемввода.239</xforms:instance>Атрибут «xmlns=""» можно перенести из xforms:instance в корневой элементэкземпляра данных.В этом случае вместо<xforms:instance xmlns=""><example><text/></example></xforms:instance>будет<xforms:instance ><example xmlns=""><text/></example></xforms:instance>Но, как правило, пустое пространство имен удобнее объявлять в элементе«xforms:instance».<!-- submission указывает куда необходимо отправить форму --><xforms:submission id="submit_id" action="" method="post"includenamespaceprefixes=""/>Элемент «xforms:submission» определяет правила отправки формы на сервер.В нашем примере элемент «xforms:submission» содержит только основныеатрибуты.
Обязательный атрибут «id» используется для ссылки на элемент«xforms:submission».Атрибут «action» задает URI серверного сценария, которому отправляютсяданные (в нашем примере он пустой, данные не отправляются).Атрибут «method» задает метод HTTP-протокола для отправки данных(обычно используется POST, иногда PUT). Метод GET здесь не может бытьиспользован, так как XML-данные не должны передаваться через строку URI.Атрибут «includenamespaceprefixes» позволяет включать в передаваемыеданные нужные префиксы пространств имен. Это полезно в том случае, когда240данные содержат пространства имен.
Пустое значение атрибута указывает, чтопрефиксы пространств имен не передаются на сервер.</xforms:model></head><body>Поля ввода данных объявляются в секции BODY документа XHTML.<xforms:group>В простом случае поля ввода данных размещаются внутри контейнерногоэлемента «xforms:group».<!-- Элемент input создает поле ввода, labelопределяет подпись к полю ввода --><xforms:input ref="text"><xforms:label>Введите текст:</xforms:label></xforms:input>Элемент «xforms:input» определяет поле ввода данных, в атрибуте «ref»указывается XPath-выражение, которое ссылается на XML-элемент данных винстансе модели.В нашем случае поле ввода соответствует XML-элементу «text».В XPath-выражении (атрибут ref) не учитывается корневой элемент модели(example), то есть атрибут ref="text", а не ref="example/text".Элемент «xforms:label» содержит подпись к полю ввода.<!-- Вывод текста из элемента text.
В атрибутеиспользуется XPath-выражениеvalue--><xforms:output value="concat('!!! ', text, ' !!!')"><xforms:label>Вывод текста:</xforms:label></xforms:output>Элемент «xforms:output» используется для вывода вычисляемых значений. Ватрибуте «value» задается вычисляемое значение в виде XPath-выражения.В нашем случае с помощью функции concat соединяется несколько строк,одной из которых является значение XML-элемента text.241Если мы введем значение в поле ввода, то в инстансе модели изменитсяXML-элемент text и содержимое xforms:output будет автоматически пересчитано.<!-- Кнопка отправки формы. Атрибут submissionссылается на элемент xforms:submission в модели --><xforms:submit submission="submit_id"><xforms:label>Отправка формы</xforms:label></xforms:submit>Элемент «xforms:submit» создает кнопку отправки формы на сервер.
Атрибут«submission»ссылаетсянаатрибут«id»соответствующегоэлемента«xforms:submission» в модели.Элемент «xforms:label» может по-разному отображаться в зависимости оттого, в какой элемент он вложен. Если он вложен в поле ввода, то отображаетсякак подпись к полю ввода, если он вложен в кнопку, то отображается как надписьна кнопке.</xforms:group></body></html>Результат выполнения примера в betterFORM:Рис. 5.1. Результат выполнения примера 5.1. Файл «input_output.xhtml».Как и обычная HTML-форма, XForms-форма может быть вложена втабличные тэги.242Следующий пример является модификацией предыдущего.
Модель данныхне изменилась, но поля ввода формы размещены в табличных тэгах.Пример 5.1. Файл «input_output_table.xhtml».<?xml version="1.0" encoding="UTF-8"?><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><title>Пример ввода и вывода значенияс таблицей</title><!-- Пустой префикс пространства имен обязателен для корневогоэлемента xforms:instance --><xforms:model><xforms:instance><example xmlns=""><text/></example></xforms:instance><xforms:submission action="" method="post" id="submit_id"includenamespaceprefixes=""/></xforms:model></head><body><table border="2" cellspacing="5"><tr><td><b>Введите текст:</b></td><!-- Элемент input пустой (не содержит элемента label), текстподсказки размещается в ячейке таблицы --><td><xforms:input ref="text"/></td></tr><tr><td><b>Вывод текста:</b></td><td><xforms:output value="concat('!!! ', text, ' !!!')"/></td></tr>243<tr><td colspan="2" align="center"><xforms:submit submission="submit_id"><xforms:label>Отправка формы</xforms:label></xforms:submit></td></tr></table></body></html>Результат выполнения примера:Рис.
5.2. Результат выполнения примера 5.1. Файл «input_output_table.xhtml».5.6 Модель данных формыРассмотрим примеры, в которых используются более сложные модификациимодели данных формы.5.6.1 Задание ограничений на типы данныхВ следующем примере с помощью элементов «xforms:bind» задаются типыданных для XML-данных в инстансе.Пример 5.2.
Файл «input.xhtml».<?xml version="1.0" encoding="UTF-8"?>244<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><title>Пример элемента input и элемента bind</title><!-- Пустой префикс пространства имен обязателен для корневогоэлемента xforms:instance --><xforms:model><xforms:instance><example xmlns=""><text/><int/><bool/><date/><time/><datetime/></example>Инстанс модели данных содержит несколько элементов, соответствующихразличным типам данных.</xforms:instance><!-- Элементы bind указывают тип данных --><!-- Тип данных указывается не для элемента управления, а дляэлемента данных в модели --><xforms:bind nodeset="bool" type="xforms:boolean"/><xforms:bind nodeset="int" type="xforms:integer"/><xforms:bind nodeset="date" type="xforms:date"/><xforms:bind nodeset="time" type="xforms:time"/><xforms:bind nodeset="datetime" type="xforms:dateTime"/>Элемент «xforms:bind» содержит обязательный атрибут «nodeset», в которомуказывается XPath-выражение для связи с XML-элементом в инстансе.В атрибуте «type» элемента «xforms:bind» задается тип данных элемента.<!-- submission указывает куда необходимо отправить форму -->245<xforms:submission action="" method="post" id="submit_id"includenamespaceprefixes=""/></xforms:model></head><body><xforms:group><xforms:input ref="text"><xforms:label>Введите текст:</xforms:label></xforms:input>Поле ввода данных не содержит информацию о типе данных элемента.Информация о типе данных автоматически берется из модели.<xforms:input ref="int"><xforms:label>Введите число:</xforms:label><xforms:alert>Значение должно быть целымчислом</xforms:alert>Элемент «xforms:alert» содержит сообщение об ошибке, которое выводится вслучае ошибки.</xforms:input><xforms:input ref="bool"><xforms:label>Введите логическое значение:</xforms:label></xforms:input><xforms:input ref="date"><xforms:label>Введите дату:</xforms:label><xforms:alert>Значение должно быть датой</xforms:alert></xforms:input><xforms:input ref="time"><xforms:label>Введите время:</xforms:label><xforms:alert>Значение должно быть временем</xforms:alert></xforms:input><xforms:input ref="datetime">246<xforms:label>Введите дату и время:</xforms:label></xforms:input><!-- Кнопка отправки формы.















