Чайниковский вопрос XSLT

cryo

Guest
Чайниковский вопрос XSLT

Подскажите пожалуйста как мне сделать что-то типа:

PHP:
<?xml version="1.0" encoding="UTF-8"?>
<document>
   <element />
<document>


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
   <new_element />
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="new_element">
    <substitution_of_new_element />
</xsl:template>

</xsl:stylesheet>
Хочу чтобы на выходе получилось

PHP:
<?xml version="1.0" encoding="utf-8"?>
<substitution_of_new_element />
Судя по спецификации XSLT на w3c.org, при сработке темплейта по матч на определенный узел в исходном XML-дереве, этот узел заменяется на содержимое темплейта. Затем "подставленные" из темплэйта узлы подвергаются обработке <xsl:template match> и.т.д. рекурсивно. У меня же что-то ничего не получается.

Суть того что я хочу сделать. Страница у меня генерится на php в виде xml документа вообще без какого-либо оформления - голые структурированные данные. Затем применяется xslt. Хочется, чтобы не засорять <xsl:template match="/> в нем сохранить только лишь блочную разметку, внешний вид блоков же вынести в отдельные темплейты. Что-то типа

PHP:
<xsl:stylesheet ... >
<xsl:template match="/">
  <html>
   <body>
      <table><tr>
       <td><left_column /></td>
       <td><center_column /></td>
      </tr></table>
   </body>
  </html>
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="left_column">
новости, статьи, навигация и.т.п. - вызываем соответствующие шаблоны, отвечающие за блоки
</xsl:template>

<xsl:template match="center_column">
   тут прорисовываем вторую колонку.
</xsl:template>

</xsl:stylesheet>
 

slach

Новичок
неправильно мыслишь =)
XSLT работает только над исходным деревом

а то что ты пишешь как
<new_element />
это вообщек result tree fragment
он в apply-template не может попасть чисто физически

кроме того
<xsl:template match="/">
это layout

зачем его убирать ??
что значит засорять ??

ну и соответсвенно
НИКТО не мешает

вместо
<td><left_column /></td>
написать

<td><xsl:call-template name="left_column"/></td>


..
<xsl:template name="left_column">
<xsl:apply-templates select="данные новостей и т.п."/>
...

или даже
<td><xsl:apply-templates mode="left_column"/></td>
...
<xsl:template match="данные_для_новостей" mode="left_column">
...
 

cryo

Guest
Автор оригинала: slach
неправильно мыслишь =)
XSLT работает только над исходным деревом
Наверняка неправильно мыслю. Желание "вправить" мозги и привело меня на форум :D

Автор оригинала: slach
кроме того
<xsl:template match="/">
это layout

зачем его убирать ??
что значит засорять ??
Убираеть его ненадо. Не засорять вынести максимальное количество любой логики из него в отдельные шаблоны. Внутри оставить только "скелет" страницы. Иначе потом такая путаница возникает


Автор оригинала: slach
ну и соответсвенно
НИКТО не мешает

вместо
<td><left_column /></td>
написать

<td><xsl:call-template name="left_column"/></td>
...
Собсна сейчас так и делаю.


Попробую немного видоизменить вопрос, авось удастся из уважаемого сообщества "вытянуть" их наработанный опытом стиль написания XSLT-шаблонов.

Считаем что у нас сложный сайт с максимальным количеством динамически генерируемого контента.
Считаем что все данные готовятся скриптами в виде xml-документа без привязки к дальнейшему расположению на странице. Только голая блочная структура с необходимыми данными.
Считаем что на страницах много самостоятельных блоков. Поэтому xslt-шаблон получается довольно сложным.

Как написать наиболее легко-читаемый, "прозрачный" без-проблем модифицируемый шаблон XSLT для такого сайта?

:)
 

BeGe

Вождь Апачей, блин (c)
Автор оригинала: Алексей Пешков
<xsl:template match="/">
<xsl:apply-templates select="document('xhtml-template.xml')"/>
</xsl:template>
Что делать ели документ создан динамически ?
 
Сверху