Объектная модель XML-документа в импортированной библиотеке будет представлена интерфейсом DOMDocument. В главном модуле проекта мы объявим две переменные, которые будут соответствовать обрабатываемому документу (xmlSource) и документу преобразования (xmlStylesheet):
var xmlSource: DOMDocument; xmlStylesheet: DOMDocument;
Для того чтобы создать экземпляры объектов наших документов, мы воспользуемся классом CoDOMDocument, который был создан в модуле MSXML2_TLB при импортировании. Метод Create этого класса создаст объекты, обращаться к методам и свойствам которых мы будет посредством уже упомянутого интерфейса DOMDocument:
xmlSource := CoDOMDocument.Create; xmlStylesheet := CoDOMDocument.Create;
Для того чтобы загрузить XML-файл мы воспользуемся функцией load интерфейса DOMDocument:
xmlSource.load('source.xml');
При загрузке файла вполне вероятны ошибки. Например, XML-документ может не являться хорошо оформленным. Для того чтобы успешно справиться с такого рода исключительными ситуациями, мы будем использовать конструкцию try...except и отрабатывать исключение EOleException:
try xmlStylesheet.load('stylesheet.xsl'); memoStylesheet.Text := xmlStylesheet.xml; except on e: EOleException do memoStylesheet.Text := e.Message; end;
Для выполнения самого преобразования нам будет нужно использовать функцию transformNode:
try memoResult.Text := xmlSource.transformNode(xmlStylesheet); except on e: EOleException do memoResult.Text := e.Message; end;
Для удобства мы можем также добавить диалоги для загрузки файлов и многое другое, но эти усовершенствования мы здесь разбирать не будем. Ограничимся тем, что приведём главную часть исходного кода этого проекта:
Пример 9.1. Использование XSLT-преобразования в Delphi
unit source; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, MSXML2_TLB, comobj; type TMain = class(TForm) { Компоненты формы и обработчики событий } private public end; var xmlSource: DOMDocument; xmlStylesheet: DOMDocument; Main: TMain; implementation {$R *.DFM} procedure TMain.FormCreate(Sender: TObject); begin xmlSource := CoDOMDocument.Create; xmlStylesheet := CoDOMDocument.Create; try xmlSource.load('source.xml'); memoSource.Text := xmlSource.xml; except on e: EOleException do memoSource.Text := e.Message; end; try xmlStylesheet.load('stylesheet.xsl'); memoStylesheet.Text := xmlStylesheet.xml; except on e: EOleException do memoStylesheet.Text := e.Message; end; end; procedure TMain.pcMainChange(Sender: TObject); begin if pcMain.ActivePage = sheetResult then try memoResult.Text := xmlSource.transformNode(xmlStylesheet); except on e: EOleException do memoResult.Text := e.Message; end; end; { Прочие процедуры и функции } end.
Процесс использования нашего приложения приведён на следующих рисунках (рис. 9.4-9.6).