memoResult.Text := e.Message;
end;
end;
{ Прочие процедуры и функции }
end.
Процесс использования нашего приложения приведен на следующих рисунках (рис. 9.4–9.6).

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

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

Рис. 9.6. Выходящий документ
Выполнение XSLT-преобразований в C/C++
В качестве примера использования XSLT в языках С и С++ мы приведем очень простую программу, которая выполняет над документом source.xml
преобразование stylesheet.xsl
и выводит результат в файл document.out
. На этот раз в качестве процессора мы будем использовать Xalan-C++, а в качестве среды разработки — Microsoft Visual С++.
Настройка путей
Для того чтобы использовать библиотеки Xalan в своем проекте, прежде всего, необходимо включить в исходный код файлы заголовков:
#include 'util/PlatformUtils.hpp'
#include 'XalanTransformer/XalanTransformer.hpp'
Файл PlatformUtils.hpp
относится к библиотеке Xerces-C++, который используется в Xalan в качестве парсера XML-документов. Файл заголовка XalanTransformer.hpp
относится к классу XalanTransformer
, который мы и будем использовать для преобразования нашего документа.
Заголовочные файлы Xalan и Xerces могут быть найдены в поставке Xalan в каталогах xml- xalancsrc
и xml-xercescsrc
соответственно. Для того чтобы они могли быть обнаружены компилятором, эти пути следует явным образом прописать в настройках среды (меню Tools/Options), как показано на рис. 9.7.

Рис. 9.7. Настройка путей Xalan в MSVC
Для того чтобы скомпилированный объектный код мог быть скомпонован, в проекте также должны быть указаны пути к библиотечным файлам Xalan (рис. 9.8).

Рис. 9.8. Настройка путей библиотек в проекте
Использование класса
Теперь, когда мы разобрались со всякого рода настройками, можно заняться самой программой. Типичный сценарий использования Xalan в программе можно проиллюстрировать следующим кодом.
// Инициализируем Xerces
XMLPlatformUtils::Initialize();
// Инициализируем класс XalanTransformer
XalanTransformer::initialize();
// Создаем экземпляр класса XalanTransformer
XalanTransformer theXalanTransformer;
...
// Выполняем преобразование
theXalanTransformer.transform( ... );
...
// Освобождаем XalanTransformer
XalanTransformer::terminate();
// Освобождаем Xerces
XMLPlatformUtils::Terminate();
В соответствии с этим сценарием наша программа будет выглядеть следующим образом:
#include 'StdAfx.h'
#include 'util/PlatformUtils.hpp'
#include 'XalanTransformer/XalanTransformer.hpp'
#include 'strstream'
int main(int argc, const char* argv[]) {
using std::cerr;
// Инициализируем Xerces
XMLPlatformUtils::Initialize();
// Инициализируем класс XalanTransformer
XalanTransformer::initialize();
// Создаем экземпляр класса XalanTransformer
XalanTransformer theXalanTransformer;
// Выполняем преобразование
int theResult = theXalanTransformer.transform('source.xml',
'stylesheet.xsl', 'document.out');
// В случае, если произошла ошибка, выводим, информацию о ней
if (theResult != 0) {
cerr << 'XalanError:
' << theXalanTransformer.getLastError();
}
// Освобождаем XalanTransformer
XalanTransformer::terminate();