В качестве примера использования 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-xalan\c\src
и xml-xerces\c\src
соответственно. Для того чтобы они могли быть обнаружены компилятором, эти пути следует явным образом прописать в настройках среды (меню Tools/Options), как показано на рис. 9.7.Рис. 9.7. Настройка путей Xalan в MSVC
Для того чтобы скомпилированный объектный код мог быть скомпонован, в проекте также должны быть указаны пути к библиотечным файлам Xalan (рис. 9.8).
Рис. 9.8. Настройка путей библиотек в проекте
Использование класса XalanTransformer
Теперь, когда мы разобрались со всякого рода настройками, можно заняться самой программой. Типичный сценарий использования Xalan в программе можно проиллюстрировать следующим кодом.
Листинг 9.2. Типовой сценарий использования 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: \n" << theXalanTransformer.getLastError();
}
// Освобождаем XalanTransformer
XalanTransformer::terminate();
// Освобождаем Xerces
XMLPlatformUtils::Terminate();
return theResult;
}
Выполнение XSLT-преобразований в PHP
Начиная с четвертых версий, PHP поставляется вместе с XSLT-процессором Sablotron, который включен в РНР в качестве расширения.
Для того чтобы использовать Sablotron в PHP-скриптах, следует выполнить следующие действия:
1. Убедиться, что файл php_sablot.dll присутствует в каталоге расширений.
2. Убедиться, что в файле php.ini присутствует строка
extension=php_sablot.dll
.3. Убедиться, что библиотеки expat.dll и sablot.dll находятся в каталоге, указанном в переменной окружения
PATH
.ЗамечаниеПриведенное описание касается только использования Sablotron на платформе Windows32. На других платформах потребуется сконфигурировать РНР с флагом
--with-sablot
. В остальном установка совершенно аналогична.Теперь, когда библиотека Sablotron подключена, мы сможем написать небольшую программу, которая будет выводить страницу гостевой книги.
Страница гостевой книги
Предположим, что мы храним (или экспортируем) данные гостевой книги в следующем формате.
Листинг 9.3. Данные гостевой книги — файл source.xml
18/08/2001
1
15/03/45BC
Julius
caesar@hotmail.com
:(
Et tu, Brute...
2
20/07/1969
Neil
What did I have to say? Oh, yes...
One small step for a man; one giant leap for mankind!
Для того чтобы вывести форму гостевой книги и сообщения, содержащиеся в
source.xml
, мы создадим следующее преобразование.Листинг 9.4. Преобразование stylesheet.xsl
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Name
E-mail
Subject
From:
Subject:
Теперь займемся самим php-скриптом.
Листинг 9.5. Скрипт guestbook.php
Guestbook
http-equiv="Content-Type"
content="text/html; charset=windows-1251">
// Загружаем входящий документ
$sourcefile = "source.xml";
$sourcehandle = fopen($sourcefile, "r")
or die("Невозможно открыть входящий документ.");
$source = fread($sourcehandle, filesize($sourcefile));
// Загружаем преобразование
$stylesheetfile = "stylesheet.xsl";
$stylesheethandle = fopen($stylesheetfile, "r")
or die("Невозможно открыть файл преобразования");
$stylesheet = fread($stylesheethandle, filesize($stylesheetfile));
// Инициализируем XSLT-процессор
$xslt = @xslt_create() or die("Can't create XSLT handle!");
// Выполняем преобразование
@xslt_process($stylesheet, $source, $result);
// Выводим результат
echo $result;
// Освобождаем ресурсы
@xslt_free($xslt);
?>
Приблизительный результат выполнения этого скрипта можно видеть на рис. 9.9.
Рис. 9.9. Сгенерированная из PHP-скрипта страница гостевой книги
Выполнение XSLT-преобразований в JavaScript