Сборка DOMDocument из N различных файлов

mcfun

Guest
Сборка DOMDocument из N различных файлов

Присказка обычная "Пишу движок" :)

Проблема: движок в процессе работы собирает результирующий XSL шаблон. На каждый модуль движка делается свой XSL шаблон из которых грубо говоря и собирается результирующий XSL шаблон. Никак не пойму как это делать, не нашёл способа вставить несколько заведомо неизвестных кусков XML в один DOMDocument. <xsl:include> использовать не хочу. Поскольку хочу кэшировать этот результирующий шаблон.

Помогите люди добрые.
 

BeGe

Вождь Апачей, блин (c)
лучше бы ты хотел кешировать меленькие куски чем весь документ :)
а так ответил тебе на твой вопрос
 

mcfun

Guest
Автор оригинала: BeGe
лучше бы ты хотел кешировать меленькие куски чем весь документ :)
а так ответил тебе на твой вопрос
Не ответил: xinclude в моём случае это то же что и xsl:include по сути, использовать это я не хочу в силу озвученных причин. Что касается кэширования то я так и делаю - у меня вообще многоуровневое кэширование. Здесь идёт речь о сборке XSL шаблона, который положится на XML вывод движка. XML может быть разный, но XSL шаблон для заданного набора модулей всегда один поэтому я и хочу его кэшировать чтобы каждый раз не собирать.

-~{}~ 20.07.05 00:17:

Автор оригинала: chameleon
[m]domdocument_xinclude[/m]
[m]dom_domdocument_importNode[/m]
тоже не подходят?
xinclude - не катит, в моём случае это ещё больший гемор чем xsl:include

domdocument->importNode пробовал но что-то не разобрался.

Впрочем в процессе написания поста разобрался. Всё работает!

Спасибо.
 

chameleon

Новичок
Хоть ты и разобрался, но видимо не до конца
Автор оригинала: mcfun
xinclude в моём случае это то же что и xsl:include по сути, использовать это я не хочу в силу озвученных причин.
-~{}~ 20.07.05 00:17:
между ними есть большая разница, если ты не заметил:
xsl:include выполняется в runtime XSLT-процессором и ессно напрямую не подходит, а вот xinclude в PHP можно подключить еще в DOM и ессно ДО кэшера, в чем ты здесь нашел гимор непонятно.
 

mcfun

Guest
Автор оригинала: chameleon
Хоть ты и разобрался, но видимо не до конца

между ними есть большая разница, если ты не заметил:
xsl:include выполняется в runtime XSLT-процессором и ессно напрямую не подходит, а вот xinclude в PHP можно подключить еще в DOM и ессно ДО кэшера, в чем ты здесь нашел гимор непонятно.
Большое спасибо за то что прояснили ситуацию, то что xinclude включается в DOM а не в realtime я просто не знал.
 

maxim

Новичок
Никто не мешает собирать один документ из нескольких.
В приведенном ниже коде (извини что не упростил для примера) В один файл вставляется другой


if(!$xsl = domxml_open_file($xsl_dir . $xsl_file))echo "Not found ".$xsl_dir . $xsl_file;

$xsl_root = $xsl->document_element();//теперь к корню надо добавить

if(!$xsl_inc = domxml_open_file(XSLROOT . $load_module . "/" . $load_page . ".xml")) echo "Not found ".$load_module . "/" . $load_page . ".xml";//хеадер


$xsl_inc_root = $xsl_inc->document_element();//для этого получаем его корень
$xsl_inc_child = $xsl_inc_root->child_nodes();// затем массив детей корня
$xsl_inc_child = $xsl_inc_child[1]->child_nodes();
for ($i = 0; $i < sizeof($xsl_inc_child); $i++) {
$xsl_root->append_child($xsl_inc_child[$i]->clone_node(TRUE));//выкидываем элемент с xmlns:xsl и добавляем собственно header
}
 

mcfun

Guest
Автор оригинала: maxim
Никто не мешает собирать один документ из нескольких.
В приведенном ниже коде (извини что не упростил для примера) В один файл вставляется другой


if(!$xsl = domxml_open_file($xsl_dir . $xsl_file))echo "Not found ".$xsl_dir . $xsl_file;

$xsl_root = $xsl->document_element();//теперь к корню надо добавить

if(!$xsl_inc = domxml_open_file(XSLROOT . $load_module . "/" . $load_page . ".xml")) echo "Not found ".$load_module . "/" . $load_page . ".xml";//хеадер


$xsl_inc_root = $xsl_inc->document_element();//для этого получаем его корень
$xsl_inc_child = $xsl_inc_root->child_nodes();// затем массив детей корня
$xsl_inc_child = $xsl_inc_child[1]->child_nodes();
for ($i = 0; $i < sizeof($xsl_inc_child); $i++) {
$xsl_root->append_child($xsl_inc_child[$i]->clone_node(TRUE));//выкидываем элемент с xmlns:xsl и добавляем собственно header
}
На самом деле всё ещё проще:
PHP:
$xp = new DOMXpath($seTheme);
		$themeTemplates = $xp->query("//xsl:template");
		
		foreach ($themeTemplates as $themeTemplate) {
			$themeTemplateNode=$seTemplate->importNode($themeTemplate,true);
			$stylesheetNode->appendChild($themeTemplateNode);
		}
 
Сверху