Преобразование XML с помощью XSLT

Задача
Есть XML-документ и таблица стилей XSL. Необходимо преобразовать документ с помощью XSLT и представить результаты. Это позволит применять таблицы стилей к данным и создавать различные версии содержания для представления в разных средствах информации.

Решение
Используйте расширение PHP XSLT:

$xml = 'data.xml';
$xsl = 'stylesheet.xsl';
$xslt = xslt_create();
$results = xslt_process($xslt, $xml, $xsl);
if (!$results) {
error_log("XSLT Error: #".xslt_errno($xslt).": ".xslt_error($xslt));
}
xslt_free($xslt);

Преобразованный текст сохраняется в переменной $results.

Обсуждение
XML-документы описывают содержание данных, но в них нет никакой информации о том, как отображать эти данные. Однако если содержание документа связано с таблицей стилей, описываемой с помощью XSL (eXtensible Stylesheet Language – открытый язык таблиц
стилей), то это содержание будет отображаться согласно определенным правилам визуализации.

Связующим звеном между XML и XSL является XSLT, который определяет преобразования открытого языка таблиц стилей.


Эти преобразования применяют к XML-данным наборы правил, перенумерованные в таблице стилей. Поэтому точно так же, как PHP анализирует
программу и объединяет ее с пользовательским вводом при создании динамической страницы, XSLT-программа использует XSL и XML для вывода новой страницы, дополнительно содержащей XML, HTML или какой-либо другой формат, который вы можете описать.Сейчас существует небольшое количество XSLT-программ с различными возможностями и ограничениями. PHP в настоящее время поддерживает лишь XSLT-процессор Sablotron. В будущем станут доступны и другие программы, такие как Xalan и Libxslt. Sablotron можно загрузить с адреса http://www.gingerall.com. Чтобы разрешить использование процессора Sablotron для XSLT-обработки, в конфигурации PHP нужно указать две опции: --enable-xslt и --with-xslt-sablot.

Обработка документов проводится в несколько этапов. Во-первых, необходимо захватить обработчик нового экземпляра XSLT-процессора с помощью функции xslt_create(). Затем для преобразования файлов и проверки результатов используйте функцию xslt_process():

$xml = 'data.xml';
$xsl = 'stylesheet.xsl';
$xslt = xslt_create();
$results = xslt_process($xslt, $xml, $xsl);

Мы начинаем с определения переменных для хранения имен файлов, содержащих XML-данные и таблицу стилей XSL.


Эти переменные будут выступать в качестве второго и третьего параметров функции преобразования xslt_process(). Если, как в данном случае, четвертый элемент опущен или установлен в значение NULL, функция вернет нам результаты преобразования. В противном случае она сохранит результаты преобразования в файле с указанным именем:

xslt_process($xslt, $xml, $xsl, 'data.html');

Если вы хотите извлекать данные XML и XSL из переменных, а не из файлов, используйте функцию xslt_process() с указанием пятого параметра, который позволяет заменить файлы строковыми переменными заполнителями:

// извлекаем информацию из базы
$r = mysql_query("SELECT pages.page AS xml, templates.template AS xsl
FROM pages, templates
WHERE pages.id=$id AND templates.id=pages.template")
or die("$php_errormsg");
$obj = mysql_fetch_object($r);
$xml = $obj->xml;
$xsl = $obj->xsl;
// преобразовываем строки в массив args
$args = array('/_xml' => $xml, '/_xsl' => $xsl);
$results = xslt_process($xslt, 'arg:/_xml', 'arg:/_xsl', NULL, $args);

При чтении и записи файлов Sablotron поддерживает два типа URI.

В PHP значением по умолчанию является «file:», поэтому Sablotronищет данные в файловой системе.


Sablotron также может использовать пользовательский URI «arg:», который разрешает в качестве альтернативы передавать данные с помощью аргументов. Именно эта возможность используется в нашем примере.

В предыдущем примере данные для XML и XSL поступают из базы данных, но точно так же они могут быть получены и из других источников, например могут быть загружены с удаленного ресурса (URL) или получены в результате передачи методом POST. При получении данных создается массив $args. Таким образом, устанавливается связь
между именами аргументов и именами переменных. Ключи ассоциативного массива являются именами аргументов, переданных функции xslt_process(); значения аргументов – переменные, содержащие данные. По соглашению именами аргументов являются /_xml и /_xsl, однако можно использовать и другие имена.

Затем вызывается функция xslt_process() и вместо имени файла data.xml используется arg:/_xml со строкой arg:, которая указывает расширению, что нужно заглянуть в массив $args. Так как массив $args передается в качестве пятого параметра, то в качестве четвертого параметра необходимо передать NULL; это заставит функцию вернуть результаты.

Проверка наличия ошибок выполняется с помощью функций xslt_error() и xslt_errno():
if (!$results) {error_log('XSLT Error: #' .


xslt_errno($xslt) . ': ' . xslt_error($xslt));
}

Функция xslt_error() возвращает форматированное сообщение, описывающее ошибку, функция xslt_errno() – числовой код ошибки.

Чтобы установить свою собственную программу обработки ошибок, зарегистрируйте нужную функцию с помощью xslt_set_error_handler().

В случае возникновения ошибок эта функция будет автоматически вызываться вместо любого встроенного обработчика.

function xslt_error_handler($processor, $level, $number, $messages) {
error_log("XSLT Error: #$level");
}
xslt_set_error_handler($xslt, 'xslt_error_handler');

Хотя PHP прекращает работу любого открытого XSLT-процессора по завершении запроса, ниже показано, как вручную закрыть процессор и освободить занимаемую им память:
xslt_close($xslt);

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ XML с помощью DOM
Анализ XML с помощью SAX
Генерация XML вручную
Генерация XML с применением DOM
Обмен данными с помощью WDDX

Вернуться в раздел: PHP / 12. XML