Журнал ВРМ World

Мировая история развития технологий управления эффективностью бизнеса – обзоры зарубежных публикаций

XForms и Microsoft InfoPath

В в третьей статье рассказывается о новом продукте Microsoft InfoPath. Автор
кратко перечисляет основные возможности этого программного средства, проводит
сравнительный анализ формата данных и базовой модели обработки InfoPath и
спецификации XForms.

"Не следуй по проторенной тропе, выбери свой путь и оставь после себя след", Ралф Уолдо Эмерсон (Ralph Waldo Emerson)

Решение компании 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 - предоставить великолепную визуальную оболочку для создания форм и их заполнения данными, ничем не уступающую по качеству другим продуктам Microsoft Office. В отличие от InfoPath, спецификация XForms нацелена не на разработку графических возможностей, а определение предназначения различных управляющих элементов, используемых для сбора данных. Эта спецификация предоставляет разработчикам широкие возможности в выборе возможности реализации того или иного управляющего элемента формы, хотя новые свойства CSS (каскадные стилевые таблицы) могут ограничивать возможный внешний вид конкретного управляющего элемента. Кроме того, в отличие от XForms, которая предназначена для быстрой генерации с помощью автоматизированных инструментальных средств, InfoPath, похоже, позволяет быстро создавать формы только с помощью мыши.

Целевая аудитория
Для выполнения рекомендуемых системных требований для InfoPath требуется весьма современный Intel-совместимый компьютер - Pentium III или выше, а также Microsoft Windows 2000 (с Service Pack 3) или выше. Кроме того, InfoPath входит только в версию Enterprise пакета Office System, которая на практике в большинстве случаев используется крупными организациями, отдающими предпочтение программным продуктам Microsoft. Спецификация XForms, наоборот, предназначена для работы в максимально возможно более широком спектре устройств, начиная мобильными телефонами и карманными компьютерами и заканчивая мощными серверами. Программное обеспечение, в котором реализована спецификация XForms, разрабатывается для различных пакетов: как с открытым исходным кодом, так и для коммерческих продуктов, которые будут работоспособны на нескольких платформах.

Область применения
Если предпочтительным типом разработки для XForms является определение декларативного XML-синтаксиса, то для InfoPath, как и для HTML-форм, это применение скрипта. Кроме того, имеются интересные различия в выборе поддерживаемых управляющих элементов форм. Например, InfoPath включает в качестве управляющих элементов форм упорядоченные и неупорядоченные списки, но не поддерживает управляющие элементы для множественного выбора или выбора списка произвольного вида (комбинированное окно, combo box).

Кратко о поддерживаемых стандартах

В 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 в этом простом интерфейсе, потребовалось выполнение в этом приложении следующих четырех условий:

  1. Единственный код валюты должен копироваться в каждый повторяющийся элемент строки.
  2. Поскольку код валюты должен присутствовать в двух позициях в каждой строке, он также копируется и во второе местоположение.
  3. Для каждого элемента строки полная цена рассчитывается как цена, умноженная на количество.
  4. Итоговая сумма суммируется по всем элементам строк.
В XForms эти четыре требования реализуется с помощью четырех XML-элементов, каждый из которых содержит необходимое для выполнения условие:

<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 остается более оптимальным выбором.

Ресурсы

Автор: Мика Дубинко (Micah Dubinko)