xslt_process

(PHP 4 >= 4.0.3)

xslt_process Запуск XSLT преобразования

Описание

mixed xslt_process ( resource $xh , string $xmlcontainer , string $xslcontainer [, string $resultcontainer [, array $arguments [, array $parameters ]]] )

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

Список параметров

xh

Идентификатор ссылки XSLT-процессора, созданный с помощью функции xslt_create().

xmlcontainer

Путь к XML файлу или псевдопеременная для XML аргумента.

xslcontainer

Путь к XSL файлу или псевдопеременная для XML аргумента.

resultcontainer

Контейнер для результата. По умолчанию, это имя файла для записи преобразованного документа. Если не задано - то есть NULL - то результат будет возвращен из функции.

arguments

Вместо явного указания аргументов XML и XSLT в функции xslt_process() можно задать "псевдопеременные", которые будут заменяться значениями из отдельного массива аргументов arguments.

parameters

Массив параметров, которые будут передаваться в XSLT-документ. Доступ к этим параметрам из XSL файлов можно получить, используя инструкцию <xsl:param name="имя_параметра">. Параметры должны быть закодированы в UTF-8, а их значения будут интерпретированы Sablotron процессором, как символьные строки. Другими словами, нельзя передавать узлы и поддеревья в качестве параметров в XSLT документ.

Контейнеры также могут быть заданы в виде массива arguments (см. ниже).

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если контейнер для результата не задан - т.е. NULL - будет возвращен результат преобразования.

Список изменений

Версия Описание
4.0.6 Эта функция больше не принимает XML строки в качестве значений xmlcontainer или xslcontainer. Передача строк с XML данными в качестве какого-либо из этих параметров приведет к ошибке распределения памяти в версиях Sablotron ранее 0.95 включительно.

Примеры

Простейший тип преобразования с помощью функции xslt_process() - это преобразование XML файла с файлом XSLT и помещение результата в третий файл, который будет содержать новый XML (или HTML) документ. Делать подобные преобразования с помощью Sablotron довольно просто...

Пример #1 Использование функции xslt_process() для преобразования XML и XSL файлов в новый XML файл

<?php

// Создание нового XSLT процессора
$xh xslt_create();

// Преобразование документа
if (xslt_process($xh'sample.xml''sample.xsl''result.xml')) {
    echo 
"УСПЕХ, sample.xml преобразован в соответствии с sample.xsl в result.xml";
    echo 
", содержимое result.xml:\n<br />\n";
    echo 
"<pre>\n";
    
readfile('result.xml');
    echo 
"</pre>\n";
} else {
    echo 
"К сожалению, sample.xml не может быть преобразован в соответсвии с sample.xsl в";
    echo 
"  result.xml по следующей причине: " xslt_error($xh) . ", код ошибки: ";
    echo 
xslt_errno($xh);
}

xslt_free($xh);

?>

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

Пример #2 Использование функции xslt_process() для преобразования XML и XSL файлов в переменную, содержащую результирующие XML данные

<?php

// Создание нового XSLT processor
$xh xslt_create();

// Преобразование документа, возврат результата в переменную $result
$result xslt_process($xh'sample.xml''sample.xsl');
if (
$result) {
    echo 
" УСПЕХ, sample.xml преобразован в соответствии с sample.xsl в переменную \$result";
    echo 
", содержимое переменной \$result следующее:\n<br />\n";
    echo 
"<pre>\n";
    echo 
$result;
    echo 
"</pre>\n";
} else {
    echo 
" К сожалению, sample.xml не может быть преобразован в соответсвии с sample.xsl в";
    echo 
" переменную \$result по следующей причине: " xslt_error($xh);
    echo 
". Код ошибки: " xslt_errno($xh);
}

xslt_free($xh);

?>

Приведенные выше ситуации и примеры являются наиболее общими и используются чаще всего. Однако, в ряде случаев XML и XSLT может быть получен из внешних источников, таких как база данных или сокет. В этих случаях XML и/или XSLT данные хранятся в переменных, а помещение их в файлы создаст дополнительные временные затраты, что для некоторых приложений критично. В этих исключительных ситуациях на помощь придет особый синтаксис "аргументов" XSLT. Вместо XML и XSLT файлов в качестве аргументов в функции xslt_process() можно задать "псевдопеременные", на места которых будут подставлены значения отдельного массива аргументов (5й аргумент функции xslt_process()). Ниже представлен пример, в котором XML и XSLT преобразуются с сохранением результата в переменной и без использования файлов вообще.

Пример #3 Использование функции xslt_process() для преобразования XML и XSL данных, содержащихся в переменных и сохранения результата в другую переменную с XML кодом.

<?php
// $xml и $xsl содержат XML и XSL данные

$arguments = array(
     
'/_xml' => $xml,
     
'/_xsl' => $xsl
);

// Создаем новый XSLT-процессор
$xh xslt_create();

// Преобразование документа
$result xslt_process($xh'arg:/_xml''arg:/_xsl'NULL$arguments);
if (
$result) {
    echo 
" УСПЕХ, sample.xml преобразован в соответствии с sample.xsl в переменную \$result";
    echo 
", содержимое переменной \$result следующее:\n<br />\n";
    echo 
"<pre>\n";
    echo 
$result;
    echo 
"</pre>\n";
} else {
    echo 
" К сожалению, sample.xml не может быть преобразован в соответсвии с sample.xsl в";
    echo 
" переменную \$result по следующей причине: " xslt_error($xh);
    echo 
". Код ошибки: " xslt_errno($xh);
}
xslt_free($xh);
?>

Пример #4 Передача PHP переменных в XSL файлы

<?php

// XML строка
$xml '<?xml version="1.0"?>
<para>
 change me
</para>'
;

// XSL строка
$xsl '
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no"
 omit-xml-declaration="yes"  media-type="text/html"/>
 <xsl:param name="myvar"/>
 <xsl:param name="mynode"/>
 <xsl:template match="/">
Моя PHP переменная : <xsl:value-of select="$myvar"/><br />
Мой набор узлов : <xsl:value-of select="$mynode"/>
 </xsl:template>
</xsl:stylesheet>'
;


$xh xslt_create();

// второй параметр будет интерпретирован как строка
$parameters = array (
  
'myvar' => 'test',
  
'mynode' => '<foo>bar</foo>'
);

$arguments = array (
  
'/_xml' => $xml,
  
'/_xsl' => $xsl
);

echo 
xslt_process($xh'arg:/_xml''arg:/_xsl'NULL$arguments$parameters);

?>

Результат выполнения данного примера:

Моя PHP переменная : test<br>
Мой набор узлов : &lt;foo&gt;bar&lt;/foo&gt;

Примечания

Замечание:

Учтите, что в случае использования Windows, вам нужно указать file:// в начале пути.

Коментарии

I noticed a slight difference in html output when upgrading to php4.1.1 on Windows.

I found the garbled output to be caused by [indent="yes"] in <xsl:output /> and simply changed it to [indent="no"].
2002-01-17 11:42:16
http://php5.kiev.ua/manual/ru/function.xslt-process.html
If you are getting the data from a database and creating the XML data stream for transformation, you can add the parameters for the stylesheet into the XML data. Once in the data, you can reference them from the XSL stylesheet directly.
2002-01-28 20:06:53
http://php5.kiev.ua/manual/ru/function.xslt-process.html
Took me a while to figure this one out, but no matter what your stylesheet encoding and xml encoding says - argument values, need to be UTF-8.

Version 4.2.1 and sablot 0.90.
2002-06-03 19:00:42
http://php5.kiev.ua/manual/ru/function.xslt-process.html
Hi,

keep in mind that fifth parameter of function xsl_process() is __arguments__ and sixth is __xsl parameters__. I spent a lot of time learning difference between arguments and parameters ;-)

Tom
2002-11-11 05:52:34
http://php5.kiev.ua/manual/ru/function.xslt-process.html
I had a little trouble making the http scheme handler work until I removed the line with the strip function and then changed the fopen 
from 'http://' to 'http:' - 

$file = fopen("http:".$rest,"r");

Regards // Martin
2003-05-27 19:06:02
http://php5.kiev.ua/manual/ru/function.xslt-process.html
Thanks, Martin !

As a matter of fact, your way of doing is probably more logical than mine :)
The point is that scheme handler strangely adds a slash to your URI , if it doesn't start by any slash.

So if you call : document('http:www.url.com',page/@url)
...then $rest gets /www.url.com

But if you call : document('http://www.url.com',page/@url)
...then $rest gets //www.url.com

Another approach could consist in enclosing the scheme "http" in the XML attribute : <page url="http://www.w3.org/TR/REC-xml">
and simply doing a : $file = fopen("http:".$rest,"r");

It all depends on the context...

See also :
http://archive.gingerall.cz/archives/public/sablot2003/msg00598.html
2003-06-10 08:57:23
http://php5.kiev.ua/manual/ru/function.xslt-process.html
Автор:
just to let you know an an apostrophe ?  can generate a  "not well-formed (invalid token)" error message. I spent a couple of hours to find it, until i found another user with similar problem:
http://www.feedforall.com/forum/viewtopic.php?t=116&view=next
lets hope that hosting providers will soon adopt php5
2005-07-08 18:35:05
http://php5.kiev.ua/manual/ru/function.xslt-process.html

    Поддержать сайт на родительском проекте КГБ