Использование XML в среде Delphi
Использование СOM в среде Delphi
Последнее время много внимания уделяется построение систем электронного бизнеса, или как их еще называют - B2B (business to business). Учитывая рекомендации по построению обменных потоковых систем координирующего интернет-технологий органа - WWW Consortium: акцент сделан в сторону XML-технологий и построение систем обмена XML-документами.
Преимущество использования XML в электронном бизнесе - высокая эффективность B2B систем при низких затратах на ее создание за счет четкого и наглядного представления структурированной информации, возможность использования современных сетевых протоколов и создания бизнес-систем реального времени.
Независимость представления информации в виде XML документов позволяет разным, участвующим в электронном бизнесе, фирмам производить независимое друг от друга ПО.
Во всех системах обмен, как правило, строится по одинаковой схеме, с использованием HTTP запросов. В качестве протокола защиты информации применяется протокол SSL (но это отдельная тема).
Один из возможных вариантов обработки XML сообщения является построение BIN/CGI (ISAPI)-приложений или COM (серверных) компонент, формирующих или обрабатывающих XML-документы.
С одной стороны, приложение выступает в качестве клиента, которое в режиме POST выдает HTTP запрос, с другой стороны, находится WEB сервер на стороне которого осуществляется обработка запроса и выдача ответа. В информационном обмене используются XML-документы.
Один из наиболее эффективных вариантов реализации - использование существующего XML-парсера, поддерживающего DOM модель. Такой парсер является дистрибутивной поставкой Win`98 или составной частью IE 4,7 и выше (для Win`95) и представляет COM сервер, находящийся в библиотеке msxml.dll.
Модель компонентных объектов (COM) - представляет инкапсулированные данные и методы в единую сущность и способ доступа к ним через систему интерфейсов. Средствами Delphi достаточно просто осуществить доступ к классам COM-объекта (в одном COM-сервере может быть включено несколько классов). Доступ к объектам осуществляется путем инициализации экземпляра класса через систему интерфейсов. Описание интерфейсов осуществляется языком определения интерфейсов (IDL), которое возможно осуществить средствами среды автоматически.
Средствами Delphi осуществляется импорт из COM-сервера msxml.dll, строится файлы описания интерфейса IDL и файл бинарного описания типов библиотеки - TLB. Данная операция осуществляется через системное меню: Project | Type Library Import: (рисунок 1). Далее появляется диалоговое окно (рисунок 2), в котором необходимо выбрать COM-объект (в нашем случае объект зарегистрирован под именем "Microsoft.XMLDom (Version 2.0)" ) и создать TLB-файл (кнопка Create Unit). Используя TLB-файл, среда генерирует "паскалевский" файл описания COM-сервера - MSXML_TLB.pas
В файле MSXML_TLB.pas описаны все интерфейсы, константы и соклассы COM-сервера.
Для доступа к объектам COM-элемента, необходимо в директиве USES добавить имя файла описания библиотеки (MSXML_TLB.pas). Ниже представлена простейшая программа, использующая DOM стандартный анализатор msxml.dll, которая загружает XML-документ и отображает его в элементе текстового поля Memo1.
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleServer, MSXML_TLB, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} Procedure TForm1.Button1Click(Sender: Tobject); // объявление сокласса объекта DOMDocument; var coDoc : CoDOMDocument; // класс, согласованный с интерфейсом IDOMDocument; var Doc: IXMLDOMDocument; begin // создание экземпляра объекта DOMDocument; Doc := coDoc.Create; // вызов метода Load экземпляра объекта DOMDocument; Doc.load('data.xml'); // доступ к свойстве xml экземпляра объекта DOMDocument; Memo1.Text:=Doc.xml; end; end.
Концепция DOM - объектная модель документа
Каждый XML документ представляется в виде набора множества объектов (классов), с помощью которых возможен доступ к отдельным элементам (полям объекта). DOM - интерфейс описывает доступ как к простым объектам типа DOMString или CharacterData, так и к частям или отдельным элементам XML документа: DOMFragmentElement, DOMNode, DOMElement.
Ниже приведены самые важные свойства и методы объектов XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Необходимо отметить, что представленные ниже методы и функции объектов DOM модели (Document Object Model) используются Microsoft XML-анализатором msxml.dll и несколько шире, чем утвержденная W3C Консорциумом DOM модель.
Более полное описание интерфейса DOM объектов можно найти на http://msdn.microsoft.com/xml/
Представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. . | |
Свойства | |
Async | Свойство идентифицирующее текущий режим обработки |
ParseError | Возвращает ссылку на объект обработки ошибки XMLDOMParseError |
Включение - выключение верификации документа. | |
url | Возвращает URL документа |
documentElement | Содержит ссылку на корневой элемент документа в виде объекта XMLDOMElement. |
Методы | |
load(url)
loadXML(xmlString) |
Загружает XML документ, |
save(objTarget) | Сохраняет XML документ в файле |
abort | Прерывание процесса загрузки и обработки документа. |
createAttribute (name) | Создает для текущего элемента новый атрибут с указанным именем. |
createNode(Type, name, nameSpaceURI) | Создает узел указанного типа и названия |
createElement(tagName) | Создает элемент документа с указанным названием. |
createTextNode(data) | Создает текст внутри документа |
getElementsByTagName(tagname) | Возвращает ссылку на коллекцию элементов документа с заданным именем |
nodeFromID(idString) | Поиск элемента по идентификатору |
Объект XMLDOMNode, реализующий базовый DOM интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле - его тип, название, полное название, его содержимое, список дочерних элементов и т.д. | |
Свойства | |
nodeName, baseName | Возвращает название текущего узла. |
prefix | Возвращает Namespace префикс. |
dataType | Определяет тип содержимого текущего узла |
nodeType, nodeTypeString | Возвращает тип текущего узла: |
attributes | Возвращает список атрибутов текущего узла в виде коллекции XMLDOMNamedNodeMap. |
text | Возвращает содержимое текущего поддерева в виде текста |
xml | Возвращает XML-представление текущего поддерева. |
nodeValue | Возвращает содержимое текущего узла. |
childNodes | Возвращает список дочерних элементов в виде XMLDOMNodeList. |
firstChild, lastChild | Возвращает первый/последний дочерний элемент |
previousSibling ,nextSibling | Возвращает предыдущий /следующий сестринский элемент. |
parentNode | Содержит ссылку на родительский элемент. |
ownerDocument | Возвращает указатель на документ, в котором находится текущий узел. |
Методы | |
appendChild(newChild) | Добавляет текущему узлу новый дочерний элемент. |
insertBefore(newChild, refChild) | Вставляет дочерний узел, располагая его в текущем поддереве "левее" узла, указанного параметром refChild. |
cloneNode (deep) | Создание копии текущего элемента. |
getAttribute(name) getAttributeNode (name) setAttribute(name, value) setAttributeNode(XMLDOMAttribute) |
Доступ к атрибутам (создание, чтение, запись) объекта. Name - имя атрибута, value - его значение. Возращает значение объект XMLDOMAttribute. |
replaceChild(newChild, oldChild) removeChild(oldChild) | Замена объекта oldChild текущего списка дочерних объектов на newChild. Удаление объекта oldChild |
selectNodes(patternString) selectSingleNode(patternString) | Возвращает объект XMLDOMNodeList, выбранное по шаблону поиска или первый узел |
transformNode(stylesheet) transformNodeToObject(stylesheet, outputObject) |
Назначает стилевую таблицу для поддерева текущего узла и возвращает строку - результат обработки. В качестве параметра передается ссылка на объект DOMDocument, в котором находятся XSL инструкции. |
Представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева. | |
length | число элементов списка узлов |
item(i) | Выбор i-того элемента из списка. Возвращает объект XMLDOMNode |
nextNode() | Выбор следующего элемента в списке. |
Использование XML в бизнесе.
Для более ясной картины необходимо пояснение, а зачем все это нужно с тем, что бы понять, как это работает:
При построении B2B или корпоративной ERP системы, при организации информационного обмена XML-документами между предприятиями или филиалами пр-я, используются эффективно себя зарекомендовавшая система передачи информации на основе имеющихся WEB серверов по HTTP протоколам.
С одной стороны, приложение выступает в качестве клиента, которое в режиме POST выдает HTTP запрос, с другой стороны, находится WEB сервер, на стороне которого осуществляется обработка запроса и выдача ответа. В качестве обмена используются XML-документы.
Например, в простой корпоративной ERP системе бухгалтерской программе (АСУ Бухучет) необходимо сформировать некий запрос на выписку накладной и передать его в филиал, который имеет склад (АСУ Склад). АРМ Аналогичная постановка задачи при создании В2В системы, когда Предприятие А запрашивает наличие продукции (делает заказ на приобретение) у Поставщика В.
Предприятие А и его программа выступает в качестве клиента. Склад обслуживает Поставщик В, у которого находится складской комплекс БД на SQL сервере. Обмен осуществляется через корпоративный WEB сервер Поставщика В.
Ниже представлен следующий типовой алгоритм обмена:
Рисунок 3.
- Предприятие А инициирует процесс А (заказ продукции), который выступает в качестве WEB-клиента.
- Процесс А формирует XML документ (например запрос- накладная) и передает его как POST запрос http на WEB сервер Поставщика В. В качестве URI - используется идентификатор ресурса обрабатывающего приложения. URI может быть одинаковым как для всех типов документов, либо индивидуальным для каждого типа. Все зависит от структуры B2B (WEB) сервера.
- WEB сервер анализирует запрос и порождает серверный Процесс В,
передавая в качестве параметра тело XML документа.
Процессе В запускается WEB-сервером и обрабатывается либо как ASP страница,CGI (ISAPI) - приложение или JAVA севрлет (серверное приложение) - Процесс В - формирует запрос на SQL-сервер базы данных.
- SQL-сервер производит необходимые операции в БД, формирует ответ и возвращает его Процессу В.
- По ответу от SQL-сервера Процесс В формирует XML документ (ответ) и возращает его как на ответ на http запрос клиентскому приложению.
- Далее, в зависимости от ситуации на стороне клиента формируется либо новый http запрос, либо заканчивается сеанс.
Несколько слов об организации документооборота.
Общим правилом разработки системы обмена XML документами является:
- во-первых - разработка схемы потоков электронных документов и их структуры;
- во-вторых - разработка таблиц функций процессов (подпроцессов) т.е. какую функцию по отношению к какому XML-документу будет реализовывать каждый процесс.
Каждый XML документ, подобно HTML документу, должен состоять из заголовка
сообщения (информация заключенная тагами
Рисунок 4. | Рисунок 5. |
Заголовок (Рисунок 4), в отличие HTML документа, должен содержать разного рода
служебную информацию, в том числе информацию о типе передаваемого документа и
процессе его обработки. В информационную обработку поступает тело документа,
т.е. содержательная часть обрамленная тагами
Для запущенного сервером Процесса, алгоритм обработки предпочтительно (но не обязательно) строить следующим образом:
Рисунок 6.
Некоторые принципиальные моменты при создании клиентской части
Как уже пояснялось, при создание XML-документа используется его представление в виде DOM модели. Ниже приведен пример части текста Delphi программы создания заголовка xml сообщения.
procedure TThread1.HeaderCreate(Sender: Tobject); var // объявление сокласса, необходим для создания coDoc : CoDomDocument ; // объекта XMLDomDocument Doc : DomDocument ; // объявление объектов DOMElement r : IXMLDOMElement; Node : IXMLDOMElement; // DOMText txt : IXMLDOMText; // DOMAttribute attr : IXMLDOMAttribute; begin // создание документа DOM Doc:=coDoc.Create; // установка синхронного режима обработки Doc.Set_async(false); // начальная инициация DOM документа Doc.LoadXML('<Header/>'); // получение адреса корневого элемента r:=Doc.Get_documentElement; // создание DOMElement (таг <Sender>) Node := Doc.createElement ( 'Sender'); // создание текстового узла 'ООО "Тайфун"' txt := Doc.createTextNode( 'ООО "Тайфун"'); // присвоение узлу <Sender> значение // текстового узла 'ООО "Тайфун"' Node.appendChild(txt); // добавление элемента <Sender> в корень документа как дочернего r.appendChild(Node); // аналогичные операции для тага <From> Node := Doc.createElement ( 'From'); txt := Doc.createTextNode( 'http://tayfun.ru/xml/default.asp'); Node.appendChild(txt); r.appendChild(Node); // аналогичные операции для тага <To> Node := Doc.createElement ( 'To'); txt := Doc.createTextNode( 'http://irbis.ru'); Node.appendChild(txt); r.appendChild(Node); // создание DOMElement () Node := Doc.createElement ( 'TypeDocument'); // создание узла XMLDOMAttribute Att := Doc.createAttribute ( 'Id ', ' Order'); // <TypeDocument Id="Order"/> Node.appendChild(Att); r.appendChild(Node); end;
Следует отметить, что объявление переменной coDoc : CoDomDocument и Doc : DomDocument , а также ее создание методом Create ( Doc:=coDoc.Create;) осуществляется один раз. Объявление переменной находится в секции описания глобальных переменных, а не в локальной процедуре, как было продемонстрировано для наглядности в данном примере (т.е. одна глобальная переменная типа DomDocument на один программный модуль).
Результатом работы вышеприведенной программы будет созданный заголовок
Рисунок 5.
Рисунок 6.
Основное преимущество передачи информации в виде XML-документов в том, что существует возможно формировать сообщение, используя независимые структуры таблиц в СУБД как на принимаемой, так и на передаваемой стороне. Используя наш пример, пусть требуется передать информацию об инвойсах Предприятия А, из СУБД имеющий структуру, изображенную на рисунке 6
Для формирования xml-документа, содержащего инвойс первоначально строится SQL-запрос (запрос А) с информацией о самом инвойсе:
SELECT * FROM Invoice_General WHERE InvoiceNum = :num // :num - параметр, который задает номер инвойса.
и далее строится SQL-запрос (запрос В) информация о товарах, описываемых в инвойсе (детальная спецификация):
SELECT Goods,Qulity,Price, HZ_cod FROM Goods WHERE InvoiceNum = :num // :num - параметр, который задает номер инвойса.
Ниже представлена часть программы, формирующей тело xml-документа:
procedure TThread1.DataBodyCreate(Sender: Tobject); var // объявление сокласса и объекта XMLDomDocument //coDoc : CoDomDocument ; // должно быть глобальным, для всего модуля. //Doc : DomDocument ; // объявление объектов DOMElement r : IXMLDOMElement; // DOMElement; Node, Node2 : IXMLDOMElement; Node3, Node4 : IXMLDOMElement; // DOMText txt : IXMLDOMText; str : String; // InvoiceNumber: integer; - глобальная переменная - // имеет значение 987654 // queryA, queryB : String; - глобальная переменная, // имеет значение,соответствующее запросу // queryA - запрос А генеральная информацией об инвойсе // queryB - запрос B информация о товарах, описываемых в // инвойсе (см. текст) begin // закрывает запрос для доступа Query.Close; // см. по тексту "запрос А" Query.Text := queryA; // присваивание значения параметров Query.Params[0].AsInteger := InvoiceNumber; // выполнение запроса Query.ExecSQL; // открытие доступа к данным запроса Query.Open; // получение адреса корневого элемента r:=Doc.Get_documentElement; // создание DOMElement (таг) Node2 := Doc.createElement ( ' Request '); // создание DOMElement (таг) Node := Doc.createElement ( 'Invoice'); // добавление элементав корень r.appendChild(Node2); // добавление элементав Node2. appendChild(Node); // создание DOMElement (таг) Node3 := Doc.createElement ( 'Depurture') ; // добавление элементав Node. appendChild(Node3); // обращение к полю 'Depurture' запроса str:= Query.FieldByName('Depurture').AsString; // создание текстового узла = значению поля txt := Doc.createTextNode( str); // присвоение узлузначение // текстового узла, переменной str Node.appendChild(txt); // аналогичные операции для тага <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany> (поле DB "Consignee" ) Node := Doc.createElement ( 'Destination'); // имя поля БД может и не совпадать с именем str:= Query.FieldByName('Consignee ').AsString; // тага, в этом преимущество использования txt := Doc.createTextNode( str); // DOM интерфейса перед СУБД, имеющим поддержку XML-интерфейса, // типа ORACLE 8i или Ms SQL 2000 Node.appendChild(txt); ... // формирование запроса на спецификацию по товарам // закрывает запрос для доступа Query.Close; // см. по тексту "запрос В", информац. О товарах Query.Text := queryВ; // присваивание значения параметров Query.Params[0].AsInteger := InvoiceNumber; // выполнение запроса Query2.ExecSQL; // открытие доступа к данным запроса Query.Open; // создание DOMElement (таг) Node3 := Doc.createElement ( ' Imems') ; // добавление элементав Node. appendChild(Node3); // цикл по всем строкам запроса while not Eof.Query do begin Node4 := Doc.createElement ( 'Imem'); // добавление элементав Node3.appendChild(Node4); // формирование данных для тагаstr:= Query.FieldByName('Price').AsString; txt := Doc.createTextNode( str); Node.appendChild(txt); ... // аналогичные операции для тагов <HZ_Cod>, <Quality>, <GoodName> end; end;
В результате выполнения данной процедуры формируется следующий текст XML-документа:
Для формирования запроса используется метод Open объекта IXMLHttpRequest:
procedure Open(const bstrMethod, - тип метода ="POST" bstrUrl, - Url адрес сервера varAsync, - режим связи асинхронный/синхронный = true bstrUser, - имя пользователя для аутентификации bstrPassword) - пароль
Создании серверной части обработки документа
Как было отмечено ранее, обработка HTTP запроса может осуществляться либо CGI-приложениями, либо Java-сервлетами. Возможен и вариант написания ASP-страниц. Но в этом случае передача данных возможна только методом "GET" через строку запроса. Хотя, обработка HTTP запроса ASP-страниц работает более эффективнее, чем CGI-приложением. Однако, на мой взгляд, без разницы, как обрабатывать, а важнее решить вопрос - как построить программу обработки, а не какими средствами.
Если из предыдущей главы мы рассмотрели варианты формирования XML-документ, то задача серверного приложения обратная - разбор XML-документов. Ниже представлена часть программы, осуществляющей разбор xml-документа:
procedure Tthread1.DataParser(Sender: Tobject); var // объявление объектов DOMElement r,FNode : IXMLDOMElement; Str,Filename : String; parm : String; // объявление сокласса и CoDocXML, CoDocXSL, CoDocResult : CoDomDocument ; // объекта XMLDomDocument XMLDoc, XSLDoc, ResultDoc : DomDocument ; // HttpStr : String; - глобальная переменная, содержащая строку HTTP запроса Begin // создание документа XMLDoc XMLDoc:=coDocXML.Create; // установка синхронного режима обработки XMLDoc.Set_async(false); // загрузка DOM документа из строки HttpStr XMLDoc.LoadXML(HttpStr); // получение адреса корневого элемента r:=Doc.Get_documentElement; // получение значения элементаFNode:= r.SelectSingleNode("//TypeDocument"); // получение значения атрибута id="Order" FileName:= FNode.GetAttibute("id"); // и формирование имени файла Order.xsl FileName:= FileName+".xsl"; // создание документа XSLDoc XSLDoc:=coDocXSL.Create; // установка синхронного режима обработки XSLDoc.Set_async(false); // загрузка DOM документа из файла Order.xsl XSLDoc.LoadXML(FileName); // создание документа XMLDoc ResultDoc:=coDocResult.Create; // установка синхронного режима обработки ResultDoc.Set_async(false); // установка проверки разбора ResultDoc.validateOnParse := true; // разбор XMLDoc по XSL-шаблону XMLDoc.transformNodeToObject(XSLDoc, ResultDoc); // переменной Str присваивается текстовое значение // результирующего документа. Str:= ResultDoc.text; // поиск элемента FNode:= r.SelectSingleNode("//InvoiceNumber"); // и получение значения элемента parm:= FNode.text; // закрывает запрос для доступа Query.Close; Query.Text := Str; // присваивание значения параметра Query.Params[0].AsString := parm; // выполнение запроса Query.ExecSQL; end;
Вся изюминка разбора заключается в применении XSL-шаблона, который сформирован для каждого типа документа индивидуально. Результатом разбора является строка SQL-запроса. В последствие выполнение сформированной строки SQL-запроса осуществит необходимые изменения данных в СУБД.
Преимущество использования разбора через шаблон еще и в том, что получается некая гибкость данных, и получается полная независимость работы алгоритма от программного кода. Ниже приведен используемый для обработки документа типа ORDER текст XSL-шаблона:
<!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header"> INSERT into TABREG ( FROM, TO, TYPEDOC,body) VALUES( ' <xsl:value-of select="from" />', '<xsl:value-of select="to" />', '<xsl:value-of select="TypeDocument/@id" />' ) </xsl:for-each> <xsl:for-each select="//item"> INSERT into GOODS ( invoiceNumber, name, price, quality) VALUES( ' :num', '<xsl:value-of select="name" />', '<xsl:value-of select="price" />', '<xsl:value-of select="quality" /> ' ) </xsl:for-each> </xsl:template> </xsl:stylesheet>
Поясняя вышеприведенный пример, надо отметить, что использование пары тагов и носит формальный характер, т.к. после разбора в результирующем XML-документе формально должен присутствовать хотя бы один узел. Метод ResultDoc.text присваивает текстовое значение полученного в ходе разбора XML-документа ResultDoc. В этом случае значением является все то, что обрамлено пары тегов и , т.е. сформированный нами SQL-запрос.
Другой особенностью написания программы надо отметить возможность использования SQL-параметра :num. Использование параметра позволяет упростить текст xsl-шаблона. Определение значение соответствующих элементов узлов XML-документа определяется первоначально выбора по имени соответствующего узла, например:
// поиск элементаи далее использование свойства text: FNode:= r.SelectSingleNode("//InvoiceNumber"); // и получение значения элемента parm:= FNode.text;
Коротко об XSL
Аббревиатура XSL происходит от eXtensible Stylesheet Language - язык форматирования таблиц стилей (XML данных). Как понятно из заголовка eXtensible Stylesheet Language (XSL) используется для форматирования XML данных. По определению W3C XSL состоит из двух частей:
- XSLT - XSL Transformation. Язык, используемый для преобразования или форматирования (трансформирования) XML документов. Таким образом, при помощи XSLT мы можем получить разные разрезы множества данных и формы представления данных.
- Элементы форматирования. К этим элементам относятся все элементы типографического оформления данных, после их обработки их при помощи XSL. Используется только для формирования HTML страниц.
При помощи XSLT мы можем отобрать нужные нам данные из XML файла, и оформить их в виде для предоставления пользователю. Например, в нашем случае мы преобразовали XML данные в виде SQL запроса. Классическое применение XSL - это, как правило форматирование данных в виде HTML страниц или более редкое представление в виде RTF файлов.
XSL файл описывает шаблон (template), согласно которому будет совершаться преобразование XML данных. Возвращаясь к xsl-шаблонам, в XSLT можно выделить следующие элементы (директивы):
xsl:apply-templates | Директива, указывающая на применение соответствующих шаблонов атрибуту select="имя шаблона" |
xsl:attribute | создает дерево атрибутов и добавляет его в выходной элемент, параметр name="имя атрибута", namespace - URI на пространство имен (префикс пространства имен) |
xsl:call-template | вызывает шаблон, атрибуту name=" URI на шаблон" |
xsl:choose xsl:when xsl:otherwise |
осуществление выбора по условию xsl:when
expr="вычисление выражения на script ", language="language-name" test= "вычисляемое выражение" |
xsl:comment | генерирует комментарий в выходной документ |
xsl:copy xsl:copy-of |
копирует текущей узел в выходной источник или вставляет фрагмент документа в узел, где атрибут select="имя узла источника" |
xsl:element | создает выходной элемент по имени, атрибут name="имя элемента", namespace="uri ссылка на пространство имен" |
xsl:for-each | повторно применяет шаблон ко всем узлам списка узлов, атрибут select задает список узлов |
xsl:if | проверка условия, задается атрибутом test в виде выражения |
xsl:include | включает внешний шаблон, атрибут href = "URI reference" |
xsl:output | специфицирует выходной результат, атрибут method может иметь значения "xml", "html" или "text" |
xsl:param | специфицирует значение параметров, атрибут name="имя параметра", select = "значение" |
xsl:processing-instruction | создает инструкцию обработки, атрибут name="имя процесс инструкции" |
xsl:sort | сортирует множество узлов, атрибуты select = "имя узла", data-type = тип данных {"text" | "number" | Qname}, order = направление сортировки {"ascending" | "descending"} |
xsl:stylesheet | определяет документ xsl-шаблонов, является корневым элементом для XSLT |
xsl:template | определяет xsl-шаблон, атрибут name= " URI префикс на имя шаблона", match= "указание на узел, к которому применяется шаблон" |
xsl:text | генерирует текст в выходной поток, атрибут disable-output-escaping = "yes" или "no", указывает на возможность генерации символов ESC |
xsl:value-of | вставляет значение выбранного узла как текст, атрибут select= "указатель на узел" из которого берут значение |
xsl:variable | специфицирует значение границ переменных, атрибут name = "имя переменной", select = "вычисление значения переменной" |
xsl:with-param | применяет параметр к шаблону, атрибут name ="имя параметра", select = выражение для вычисления текущего контекста, значение по умолчанию "." |
Заключение
В заключение, необходимо отметить, что использование стандартного XML-парсера msxml.dll является не единственным средством разбора и создания XML-документов. Например, для создание XML документов эффективно использовать компоненты TPageProduser и TТableProduser. Но, данная статья лишь подчеркивает широту и возможность применения на практике DOM модели .
Автор будет очень благодарен за отзывы об актуальности темы, общем содержании, стиле изложения, а также всем остальным комментариям, которые помогут в дальнейшем улучшить качество написания сборника статей и выпуску книги, освещающую тему практической стороны использования XML-документов в электронной коммерции. Более подробную информацию о практической стороне применения электронных документов можно почерпнуть на авторском сайте www.eDocs.al.ru Также на авторском сайте планируется разместить исходные тексты и примеры.
Оставить комментарий
Комментарии
project - import type library - microsoft xml 2.0 - create unit
Ошибка вылетала на строке из примера:
txt := Doc.createTextNode( 'ООО "Тайфун"');
Открыл библиотеку посмотрел и поменял обьявления:
было:
Var
.....
txt : IXMLDOMText;
надо :
Var
.....
txt : IXMLDOMCharacterData;
ну и все заработало
А не судьба ещё по инету полазить - на Delphi Kingdom эта же, но уже переработанная статья. Итак, ближе к делу.
Ошибка у всех возникает вот из-за следующей неточности.
Нужно писать
Doc.LoadXML('<Header/>');
вместо
Doc.LoadXML('');
Логично, иначе документ пуст... -> nil.
Автору статьи - респект!
то несовместимоть типов, то эксепшины, может я что-нибудь не так делаю?