Alexandre
PHPПенсионер
Шаблоное мышление в XSLT преобразованиях.
Начиная работать с XSLT сталкнулся сосследующей проблемой:
Когда шаблон простой: одна, две таблицы, форма или еще что-либо, то проблем не возникает.
Динамическое создание страницы, как правило строится по след. схеме:
На основа информации из БД, GET/POST переменных строится XML данные.
готовый XSL шаблон хранится в файле данных myform.xsl (или БД)
Далее выполняем XSLT преобразование:
и выводим полученный результат. Сдесь вопросов нет.
Но вот когда: элементв формы формируются динамически, помимо текста,
в качестве данных в форме используется иные таги,
динамическая структура формирования формы в зависимости от разных условий и т.п,
то используя вышепревиденную схему сталкиваешься с рядом проблем:
- трудно написать и отладить корректный xsl файл
- большой xsl файл становится труднопонимаемым (пример: http://edocs.phpclub.net/test1/admin/a_news.xsl)
- время парсинга сложного файла превышает все ожидания
(Пример с файлом a_news.xsl: 1.7 сек
используя шаблоны файловой системы (6 шаблонов) - 1.5 сек
используя шаблоны БД - 1.1 сек).
следует помнить, что время парсинга находится в экспонентциальной зависимости от степени сложности шаблона.
по этому с более сложными шаблонами будут большие проблемы.
Ища ряд вариантов, я пришел к выводу, что необходимо использовать Философию шаблонов в XSLT преобразованиях.
Одно сложное преобразование я разбиваю на два (или более) мелких и осуществляю два более простых преобразования.
Преобразование 1: XMLdata + XSLfile -> XSL temlate
формирование шаблона 2: XSL temlate + XSLfile2 -> XSL2
Преобразование 2: XMLdata2 + XSL2 -> HTML
Весь фокус в том, что xsl-шаблон второго преобразования я генерю автоматически,
подобно построению одного шаблона для использование его в другом.
Для этого в том месте, где мне надо вставить новый шаблон в XSLfile я вставляю тег <xsl:applay-template match="mytag">
Но если я вставлю таг явным образом, то XSLT процессор выдаст ошибки, т.к. тага шаблона с match="mytag" несуществует.
Он у меня во второй части шаблона. По этому используется конструкция xsl-Элемент:
Вторым действием - в зависимости о результатов вычислений или иных условий,
я подцепляю к сформированному мною XSL temlate (переменная $result1) кусок XSLfile2 ( file2.xsl)
в результате чего получаю второй шаблон.
Третие действие - выполняем XSLT преобразование и выводим полученный результат.
Пример:
Хочетси отметить, что в зависимости о хора выполнения программы мы можем приаттачить как кусок файла file2.xsl, так и file3.xsl...
Начиная работать с XSLT сталкнулся сосследующей проблемой:
Когда шаблон простой: одна, две таблицы, форма или еще что-либо, то проблем не возникает.
Динамическое создание страницы, как правило строится по след. схеме:
На основа информации из БД, GET/POST переменных строится XML данные.
готовый XSL шаблон хранится в файле данных myform.xsl (или БД)
Далее выполняем XSLT преобразование:
PHP:
$xh = xslt_create();
$xmlData = ... // формирую из БД. $_POST, расчетов и и т.д..
$xsl = file('file.xsl ');
$xslData = join('',$xsl);
$arguments = array( '/_xml' => $xmlData, '/_xsl' => $xslData );
$result = @xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
echo $results;
xslt_free();
Но вот когда: элементв формы формируются динамически, помимо текста,
в качестве данных в форме используется иные таги,
динамическая структура формирования формы в зависимости от разных условий и т.п,
то используя вышепревиденную схему сталкиваешься с рядом проблем:
- трудно написать и отладить корректный xsl файл
- большой xsl файл становится труднопонимаемым (пример: http://edocs.phpclub.net/test1/admin/a_news.xsl)
- время парсинга сложного файла превышает все ожидания
(Пример с файлом a_news.xsl: 1.7 сек
используя шаблоны файловой системы (6 шаблонов) - 1.5 сек
используя шаблоны БД - 1.1 сек).
следует помнить, что время парсинга находится в экспонентциальной зависимости от степени сложности шаблона.
по этому с более сложными шаблонами будут большие проблемы.
Ища ряд вариантов, я пришел к выводу, что необходимо использовать Философию шаблонов в XSLT преобразованиях.
Одно сложное преобразование я разбиваю на два (или более) мелких и осуществляю два более простых преобразования.
Преобразование 1: XMLdata + XSLfile -> XSL temlate
формирование шаблона 2: XSL temlate + XSLfile2 -> XSL2
Преобразование 2: XMLdata2 + XSL2 -> HTML
Весь фокус в том, что xsl-шаблон второго преобразования я генерю автоматически,
подобно построению одного шаблона для использование его в другом.
Для этого в том месте, где мне надо вставить новый шаблон в XSLfile я вставляю тег <xsl:applay-template match="mytag">
Но если я вставлю таг явным образом, то XSLT процессор выдаст ошибки, т.к. тага шаблона с match="mytag" несуществует.
Он у меня во второй части шаблона. По этому используется конструкция xsl-Элемент:
PHP:
<xsl:element name="xsl:applay-temlplate">
<xsl:attribute name="match">mytag</xsl:attribute >
</xsl:element>
я подцепляю к сформированному мною XSL temlate (переменная $result1) кусок XSLfile2 ( file2.xsl)
в результате чего получаю второй шаблон.
Третие действие - выполняем XSLT преобразование и выводим полученный результат.
Пример:
PHP:
$xh = xslt_create();
/* первый кусок */
$result1 = @xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
// первое преобразование
$xmlData = ... // формирую из БД. $_POST, расчетов вторую часть XML данных
$xsl = file('file2.xsl '); // ввожу второй кусок xsl. файла
$xsltxt = join('',$xsl);
$xslData = '<?xml version="1.0"' ?><!DOCTYPE xsl:stylesheet>';
$xslData .= '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">';
$xslData .= '<xsl:template match="/">';
$xslData .= $result1;
$xslData .= '</xsl:template >';
/* сформировали xsl шаблон */
$xslData .= $xsltxt ; // подцепили шаблон обработки XML данных тега mytag
$xslData .= '</xsl:stylesheet>'; // закрыли xsl документ
$arguments = array( '/_xml' => $xmlData, '/_xsl' => $xslData );
$result2 = @xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
// второе преобразоване
echo $result2; // и наконец долгожданный вывод.
xslt_free();