Шаблоное мышление в XSLT преобразованиях.

идея:

  • не сталкивался с этой проблемой

    Голосов: 0 0,0%
  • хорошая идея, стоит оформить в статью

    Голосов: 3 75,0%
  • сам ранее дошел до этого

    Голосов: 1 25,0%
  • ничего не понял

    Голосов: 1 25,0%

  • Всего проголосовало
    4

Alexandre

PHPПенсионер
Шаблоное мышление в XSLT преобразованиях.

Начиная работать с 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();
Хочетси отметить, что в зависимости о хора выполнения программы мы можем приаттачить как кусок файла file2.xsl, так и file3.xsl...
 

Glider

Guest
Может, я не понял глубинный смысл всего вышеприведенного, но, имхо, проще использовать <xsl:include/>
Плюсы:

  1. шаблоны стандартных элементов выделяются в отдельные файлы -> их легко читать/править
  2. переменное содержание страницы также описывается шаблонами в отдельных xsl-файлах.
    [/list=1]
 

Alexandre

PHPПенсионер
я не понял глубинный смысл всего вышеприведенного
следует помнить, что время парсинга находится в экспонентциальной зависимости от степени сложности шаблона.
по этому с более сложными шаблонами будут большие проблемы.
 

olpa

Новичок
"хорошая идея, стоит оформить в статью" + перед этим не забыть посмотреть ссылки google по запросу "style-free site:xml.com".
 

Alexandre

PHPПенсионер
идеи немного разные,
у меня идет формирование документа в два и более парсинга
а там идет разбитие на несколоко шаблонов, но парсинг один.

но это тоже интерестная идея.
и может кто-нибудь и возмется это перевести - полезно будет.
 

KostyaCat

мы где-то рядом
chameleon, статейка замечательная...
вот только как надо раскорячиться, чтоб такое "сотворить"? =)
 
Сверху