xslt динамичное подключение шаблонов

Kirill

Новичок
xslt динамичное подключение шаблонов

Вся проблема в том что xsl:include и xsl:import должны быть в корне, т.е. нельзя вложить их в шаблон и в for-each сделать подключения нужных шаблонов. Как нибудь можно выйти из этой ситуации. Нужно в xslt подключить шаблоны которые есть в ноде <templates>. Или тут только средствами php править шаблон и дописывать include?
 

Scud

Новичок
Можно средствами DOM вставить нужные ноды в трансформатор, этими же средствами, с помощью XPath можно проанализировать содержимое <templates>
 

slach

Новичок
Scud а что толку что ты средствами DOM вставишь xsl:include??
при запуске трансформации все равно тебе XSLT процессор ошибку выдаст

IMHO проще через php callbacks и вложенные трансформации
 

Alexandre

PHPПенсионер
Блин,
используем средства, не зная их предназначения...
Вся проблема в том что xsl:include и xsl:import должны быть в корне
Ни xsl:include ни xsl:import не должны подключаться динамически.

Динамического подключения шаблонов не может быть в принципе. Если хочешь использовать XSLT, старайся использовать его по его же правилам.

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

Используй для подключения <xsl:apply-templete> or <xsl:call-templete>
 

Scud

Новичок
Автор оригинала: slach
Scud а что толку что ты средствами DOM вставишь xsl:include??
при запуске трансформации все равно тебе XSLT процессор ошибку выдаст

IMHO проще через php callbacks и вложенные трансформации
Так я ж предлагал их в корень вставить, а не куда-либо ещё.
 

Sender

Новичок
slach
PHP:
		/**
		 * Добавляем XSL-файлы как xsl:import директивы в XSLT шаблон
		 * @param DOMNode $DocumentElement
		 * @param array $XSLTIncludeFiles
		 */
		function AppendXSLTImportFiles( $DocumentElement, $XSLTIncludeFiles )
		{
			foreach ( $XSLTIncludeFiles as $file )
			{
				$ImportNode = $this->XSLDocument->createElementNS( $DocumentElement->namespaceURI, 'xsl:import' );
				$ImportNode->setAttribute( 'href', $file );
				$DocumentElement->insertBefore( $ImportNode, $DocumentElement->firstChild->nextSibling );
			}
		}
все работает на ура

-~{}~ 09.07.07 18:53:

Alexandre
а как быть с layout'ами и производительностью? я не хочу вставлять в layout все xsl:import, которые могут понадобиться, а добавлять только необходимые динамически
 

Alexandre

PHPПенсионер
XSLT вообще производительность страдает - если уж на то пошло

я уже подсказал выход - используй <xsl:apply-template />

и надо делать подключения не снаружи внутрь (аналог инклудов в смарти), а наоборот, изнутри на ружу. Тогда все подряд инклудить и не придется.
 

Sender

Новичок
Alexandre
покажите мне изнутри наружу "инклуд"



чтобы сделать <xsl:apply-template /> должен быть описан этот template для начала
 

Alexandre

PHPПенсионер
Sender это все зависит от того, как ты построишь свои шаблоны.

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

Sender

Новичок
Alexandre
Я и хочу взглянуть в другой плоскости, вернее пробовал, но не получилось у меня найти другого решения. Подскажете?

Допустим есть три файла:
content.xsl, там:
<xsl:template match="CONTENT_MODULE">

navigation.xsl, там:
<xsl:template match="NAVIGATION_MODULE">

есть layout.xsl, там:
<xsl:for-each select="/DOCUMENT/*[SECTION=1]">
<xsl:apply-templates select="."/>
</xsl:for-each>

вопрос, как не делая в layout.xsl xsl:import для модульных файлов произвести трансформацию?
 

Sender

Новичок
Scud
отлично придумано....
а если layout'ов около 5, а модулей около 20?
в каждом модуле идет перечисление около десятка других и пяток layout'ов еще...

при этом мне необходимо просто отобразить layout с один модулем, а вместо этого подгружается все 20 и т.д. думается это неоптимально и неудобно
 

Scud

Новичок
Опиши свою систему подробнее, так это всё "писями по воде вилено".
 

Sender

Новичок
Scud
я уже описал какие файлы есть в системе.
Необходимо сделать преобразование, в котором будут учавствовать:
а) все три файла
б) два файла в любых сочетаниях: layout.xsl, navigation.xsl; layout, content

Если вы предлагаете "Делать import navigation.xsl и layout.xsl из content.xsl" то при случае б) navigation.xsl будет лишним импортом. Это раз. А второе это то что мне допустим надо показать страницу с двумя модулями одновременно, как тогда?

Теперь соответственно увеличиваем число модулей/файлов и число layout-файлов и получаем кучу ненужных импортов.


я где-то неправ?
 

Alexandre

PHPПенсионер
я где-то не въехал, что такое layout, почему их пять...

я могу просто отписаться, что просто не оптимально построенна система шаблонов.

Но я не понял суть задачи.

лично я делал так:
- у меня был общий шаблон,
- шаблон навигации
- контентный шаблон
- библиотека стандартных шаблонов LST (преобразования даты, календарь и пр...)

импорты были в контентный шаблон - шаблонов навигации и общего шаблона (и при необходимости LST).

контентных шаблонов было штук пять ( двадцать пять), в зависимости от кол-ва модулей.

Ни чего лишнего.

Если языков два, три - то тут надо подключать два общих шаблона, хотя можно сделать один мультиязычный, а язык указывать как данные. Про языки есть несколько способов, это отдельная песня. Один из них - доработать gettext под xslt.
 

Sender

Новичок
Alexandre
layout это и есть общий шаблон, допустим у вас есть верстка двух и трехколоночная, эта два layout'а, в зависимости от того какая верстка на этой странице - тот layout и подгружаем


я не понимаю как вы формируете конечную страницу с таким построением шаблонов. В XSLT процессор можно подать только один XSLT файл насколько я знаю, вы же как-то подаете два и более файлов? иначе как вы строите страницу с несколькими модулями? формируете сначала для каждого модуля html отдельно и потом собираете это все дело в общем шаблоне? тогда я не понимаю зачем общий шаблон включать в контентный...
 

Alexandre

PHPПенсионер
В XSLT процессор можно подать только один XSLT файл
так и есть
формируете сначала для каждого модуля html отдельно и потом собираете это все дело в общем шаблоне?
нет, я не сторонник такого подхода, но часто встречал такие решения.

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

У меня формируется комплексный XML, в котором содержится вся информация по навигации и контенту (сюда можно впихнуть и голосование и погоду...)

далее идет трансформация контентного шаблона, с подключением необходимых шаблонов.

еще раз хочу заметить, что XSLT- не очень хорошее решение, для формирование HTML.

почему я делаю именнто так, потому что это называется разделение кода и представления, ОНИ НЕ ДОЛЖНЫ БЫТЬ СМЕШАННЫМИ.

я формирую XML и знаю, что должно быть на входе трансформации.

Далее я отлаживаю свои XSLT вне РНР, т.е. специализированными дебаггерами и ИДЕ.

далее верстальщик, имея простой бат файл - дорабатывает мои шаблоны до идеального представления, а я в это время пилю пхп-код

все довольны...
 
Сверху