Использование DOMDocument

Объектная модель 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).

Входящий документ

Рисунок 9.4. Входящий документ

Преобразование

Рисунок 9.5. Преобразование

Выходящий документ

Рисунок 9.6. Выходящий документ