Разработчику. Сборник рецептов PHP
Задавайте вопросы

Преобразование 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 для 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. Эти переменные будут выступать в качестве второго и третьего параметров функции преобразования slt_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:», который разрешает в качестве альтернативы передавать данные с помощью аргументов. Именно эта возможность используется в нашем примере.


(*)URI (Uniform Resource Identifiers) – единый, или универсальный идентификатор ресурсов.

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

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

ror() и 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);

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ