- 29 октября 2003 г.
XForms и Microsoft InfoPath
В в третьей статье рассказывается о новом продукте Microsoft InfoPath. Автор
кратко перечисляет основные возможности этого программного средства, проводит
сравнительный анализ формата данных и базовой модели обработки InfoPath и
спецификации XForms.
Решение компании Microsoft выпустить в этом месяца InfoPath 2003 должно положить конец расхожим домыслам об отношении компьютерного гиганта к вопросу сбора XML-данных. На первый взгляд InfoPath обладает все теми функциональными возможностями, что и различные процессоры XForms, рассмотренные автором в более ранней статье. Несмотря на то, что на сайте Microsoft в разделе "Часто задаваемые вопросы о InfoPath" отныне отсутствует какое-либо упоминание о XForms, их часто сравнивают и сопоставляют с InfoPath.
Следует уточнить: InfoPath - это приложение, а XForms - формат данных, так что сравнивать их "в лоб" некорректно. С другой стороны, можно сопоставлять формат данных и базовую модель обработки InfoPath с XForms. Именно этот подход и использован в этой статье.
Как InfoPath работает
Приложение InfoPath, в многом как и процессоры XForms, превращает данные, введенные пользователем, в новый или модифицированный XML, который затем может быть передан в прикладную систему (back-end system). Таким образом, InfoPath используется и для разработки, и для заполнения формы.
Для хранения и обработки одного документа InfoPath используется несколько файлов, которые могут быть представлены в виде одного сжатого CAB-файла с расширением .xsn, либо хранятся в той же папке, что и этот CAB-файл.
manifest.xsf
Этот файл содержит декларацию (manifest), т.е. список всех других файлов, входящих в этот пакет, называемый решением. InfoPath хранит в нем и другую информацию, включая метаданные, сведения о панелях инструментов и меню, связанных с каждым представлением (view), информацию о внешних источниках данных и сообщения об ошибках.
Этот файл является грубым аналогом XForms Model - он содержит "досье" формы.
view1.xsl, view2.xsl, view3.xsl, ...
В пакете обязательно присутствуют один или несколько последовательно пронумерованных XSLT-файлов, каждый из которых определяет представление InfoPath, являющиеся редактируемым отображением XML-данных. Каждый XSLT-файл получает в качестве входных данных экземпляр XML и преобразует его к выходному формату, схожему с HTML, но дополненному функциональными возможностями, присущими InfoPath.
Хотя у этого XSLT-преобразования нет соответствия в XForms, этот схожий с HTML формат, полученный в результате преобразования, концептуально аналогичен спецификации XForms User Interface.
template.xml
Этот файл содержит текущие XML-данные, которые можно редактировать с помощью InfoPath. При публикации готовой формы InfoPath по какому-либо определенному адресу (местоположению) можно передавать только экземпляр XML, либо отправлять его по электронной почте или доставлять каким-либо иным способом. Этот файл включает специальную пару инструкций обработки, необходимых для задания связи между данными формы и метаданными:
<?mso-infoPathSolution solutionVersion="1.0.0.1" href="manifest.xsf"
productVersion="11.0.5531" PIVersion="1.0.0.0" ?>
<?mso-application progid="InfoPath.Document"?>
При открытии любого XML-документа, содержащего эти инструкций обработки, с помощью Internet Explorer, последний попытается запустить локально установленное приложение InfoPath, указав ему на заданный файл декларации (manifest.xsf). К сожалению, это относится только к Internet Explorer и не поддерживается другими браузерами.
myschema.xsd
InfoPath полностью соответствует требованиям спецификации "XML-схема W3C" (W3C XML Schema, WXS) и поддерживает экземпляр WXS для основных XML-данных. Так, если шаблон XML не является допустимым согласно указанной схеме, InfoPath не станет открывать форму. Графическое представление Data Source (источник данных), хотя и не являющееся полнофункциональным редактором позволяет вносить изменения в WXS.
script.js
InfoPath также предоставляет возможность написания скриптов: либо на Jscript, либо на VBScript. Если документ InfoPath содержит скрипт, то по умолчанию он хранится в этом файле.
Документ InfoPath также может содержать другие пользовательские файлы, включая изображения, XML, который может быть использован как альтернативный источник данных, и даже HTML-файл, который можно отображать в специальной области, называемой Task Pane (Панель задач).
Сходство и различия
Итак, как же можно сравнить InfoPath с XForms? На первый взгляд оба предназначены для решения схожих задач: преобразования пользовательских данных в XML. Но при более тщательном рассмотрении обе технологии различают и в специализации, и в целевой аудитории, и в области применения.
Специализация
Целевая аудитория
Область применения
Кратко о поддерживаемых стандартах
В InfoPath задействован внушительный список технологий, включая WXS, DOM и XSLT. Такая архитектура продукта может быть весьма привлекательна для Web-разработчиков, которые займутся изменением существующего контента InfoPath. Другие архитектурные решения, однако, вероятно будут ограничены возможностью использования InfoPath только с браузерами, платформами или серверами, разрабатываемыми компанией Microsoft. Например, любые затраты по разработке решения InfoPath окажутся напрасными в случае изменения состава инструментальных средств, даже если они будут жестко поддерживать существующие стандарты.
Практический пример
Несмотря на различия, сравнение InfoPath с XForms неизбежно. В одной из глав книги "Основы XForms" (XForms Essentials), написанной автором этой статьи, рассматривается приложение для заказа на поставку, реализованное на языке UBL (Universal Business Language, универсальный язык бизнеса). Это приложение можно создать и на InfoPath и, таким образом, сравнить результаты. Создание такого приложения выполняется в InfoPath в основном посредством манипулирования мышью (см. рис. 1).
Рис. 1. Режим проектирования формы (design view) в Microsoft InfoPath
Несмотря на то, что ограничения InfoPath потребовали внесения нескольких изменений - например, отсутствует аналог управляющего элемента range для движка, изменяющего значение - в целом решение оказалось весьма похожим на созданное на XForms.
Однако, следует отметить одно явное различие - таблицы, которые отображаются в виде пунктирной линии, обязательной для любого типа компоновки формы, могут вызывать определенные сложности в восприятии у пользователей со слабым зрением.
Еще одно ощутимое отличие - отсутствие декларативных элементов. В XForms элемент bind устанавливает зависимость, которой придерживается процессор XForms; например, если тип валюты вводится один раз, он копируется во все элементы строки. В InfoPath требуется скрипт, прикрепленный к ряду различных точек ввода. Для того, чтобы соблюсти правила UBL в этом простом интерфейсе, потребовалось выполнение в этом приложении следующих четырех условий:
- Единственный код валюты должен копироваться в каждый повторяющийся элемент строки.
- Поскольку код валюты должен присутствовать в двух позициях в каждой строке, он также копируется и во второе местоположение.
- Для каждого элемента строки полная цена рассчитывается как цена, умноженная на количество.
- Итоговая сумма суммируется по всем элементам строк.
<xforms:bind nodeset="cat:OrderLine/cat:LineExtensionAmount/@currencyID"
calculate="../../cat:LineExtensionTotalAmount/@currencyID"/>
<xforms:bind nodeset="cat:OrderLine/cat:Item/cat:BasePrice/cat:PriceAmount/@currencyID"
calculate="../../../../cat:LineExtensionTotalAmount/@currencyID"/>
<xforms:bind nodeset="cat:OrderLine/cat:LineExtensionAmount"
type="xs:decimal"
calculate="../cat:Quantity * ../cat:Item/cat:BasePrice/cat:PriceAmount"/>
<xforms:bind nodeset="cat:LineExtensionTotalAmount" type="xs:decimal"
calculate="sum(../cat:OrderLine/cat:LineExtensionAmount)"/>
В InfoPath, однако, для этого потребуется приблизительно 70 строчек скрипта:
XDocument.DOM.setProperty("SelectionNamespaces",
'xmlns:cat="urn:oasis:names:tc:ubl:CommonAggregateTypes:1.0:0.70"
xmlns:ns1="urn:oasis:names:tc:ubl:Order:1.0:0.70"
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2003-04-19T20:40:35"');
function XDocument::OnLoad(eventObj) {
updateCurrency();
}
// This function is associated with:
// /ns1:Order/cat:OrderLine/cat:Quantity
function msoxd_cat_Quantity::OnAfterChange(eventObj) {
recalcLineItem(eventObj.Site.parentNode);
recalcTotal();
}
// This function is associated with:
// /ns1:Order/cat:OrderLine/cat:Item/cat:BasePrice/cat:PriceAmount
function msoxd_cat_PriceAmount::OnAfterChange(eventObj) {
recalcLineItem(eventObj.Site.parentNode.parentNode.parentNode);
recalcTotal();
}
// This function is associated with: /ns1:Order/cat:LineExtensionTotalAmount/@currencyID
function msoxd__LineExtensionTotalAmount_currencyID_attr::OnAfterChange(eventObj) {
updateCurrency();
}
function recalcLineItem( lineNode ) {
var quantity = lineNode.selectSingleNode("cat:Quantity");
var price = lineNode.selectSingleNode("cat:Item/cat:BasePrice/cat:PriceAmount");
var extended = lineNode.selectSingleNode("cat:LineExtensionAmount");
var extPrice = parseFloat(getElementValue(quantity)) * parseFloat(getElementValue(price));
setElementValue(extended , floatToString(extPrice, 2));
}
function recalcTotal() {
var dom = XDocument.DOM;
var extended = dom.selectSingleNode("/ns1:Order/cat:LineExtensionTotalAmount");
var newTotal = sum("/ns1:Order/cat:OrderLine/cat:LineExtensionAmount");
setElementValue( extended, newTotal );
}
function updateCurrency() {
var dom = XDocument.DOM;
var copyFrom = dom.selectSingleNode("/ns1:Order/cat:LineExtensionTotalAmount/@currencyID");
var lines = dom.selectNodes("/ns1:Order/cat:OrderLine");
// loop through each line item, copying in the currencyID
for (var idx=0; idx<lines.length; idx++) {
var copyTo = lines[idx].selectSingleNode("cat:LineExtensionAmount/@currencyID");
copyTo.nodeValue = copyFrom.nodeValue;
copyTo = lines[idx].selectSingleNode("cat:Item/cat:BasePrice/cat:PriceAmount/@currencyID");
copyTo.nodeValue = copyFrom.nodeValue;
}
}
// Utility functions
function getElementValue( node ) {
if (node.firstChild)
return node.firstChild.nodeValue;
else
return "";
}
function setElementValue( node, newval ) {
if (node.firstChild) {
node.firstChild.nodeValue = newval;
} else {
var textnode = node.ownerDocument.createTextNode( newval );
node.appendChild( textnode );
}
}
function sum(xpath) {
var nodes = XDocument.DOM.selectNodes(xpath);
var total = 0;
for (var idx=0; idx<nodes.length; idx++) {
total = total + parseFloat(getElementValue(nodes[idx]));
}
return total;
}
function floatToString(value)
{
return "" + value;
}
При использовании данного подхода (скрипта) необходимо быть внимательным при получении и установлении значений из XML-элементов. В соответствии с положениями модели DOM, фактические значения данных хранятся в текстовом узле-потомке узла элемента, с тем исключением, что пустые значения задаются отсутствием любого потомка текстового узла.
При первом использовании этого скрипта автор не стал прикреплять точку ввода OnLoad. Приложение, казалось, отработало, но с небольшой ошибкой: если начальное значение в списке выбора валюты не изменяется, значение валюты не передается в XML. Очевидное преимущество декларативного подхода заключается в том, что он одинаково относится как к начальным условиям, так и к текущему состоянию. В примере с XForms отсутствовала необходимость инициализации.
В этой статье не рассмотрены мощные экземпляры форм, которые поставляются вместе с InfoPath, включая большую библиотеку скриптов, которые можно многократно использовать. Законченный документ InfoPath можно заполнить данными в том же самом приложении, в котором разрабатывалась форма (см. рис. 2)
Рис. 2. Режим ввода данных в Microsoft InfoPath
Заключение
И InfoPath, и XForms - это версии 1.0, вероятно, в будущем они будут улучшены. Для организаций, которые уже приобрели лицензии Office System 2003, InfoPath - это прекрасное средство для решения задач автоматизированного сбора данных. Для систем, в которых не используется Office System 2003, включая настольные Mac и Linux, мобильные телефоны, карманные компьютеры и даже некоторые персональные компьютеры, XForms остается более оптимальным выбором.
Ресурсы
- Набор инструментальных средств разработки программного обеспечения Microsoft InfoPath (Microsoft InfoPath SDK).
- Раздел "Часто задаваемые вопросы о InfoPath" на сайте Microsoft.
- Ресурс "Неофициальные часто задаваемые вопросы о InfoPath", поддерживаемый Стивеном Камминсом (Stephen Cummins) и Ричардом Фицпатриком (Richard Fitzpatrick).
- Книга "Основы XForms" (XForms Essentials), опубликованная в издательстве O'Reilly. Эту книгу также можно получить в соответствии с лицензией GFDL (GNU Free Documentation License, лицензия на бесплатное использование документации GNU).
Автор: Мика Дубинко (Micah Dubinko)