Модуляризация XSLT преобразования
От: _dvp  
Дата: 18.02.04 23:10
Оценка:
Уважаемые мастера, у меня такой вопрос:

Для создания некоего сайта была задумана определённая структура его отображения, общими чертами описываемая так

<site>
<menu>
<menuitem>Новости</menuitem>
.........
<menuitem>Форум</menuitem>
</menu>
.......
<content>
........
</content>
</site>

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

Т.е. для новостей там может быть

<news>
<item>Текст новости</item>
.............
<item>Текст новости</item>
</news>

а для форума например

<forum>
<topic>
...........
</topic>
</forum>


Сгенерировать результирующий XML код всей страницы — раз плюнуть.
Проблема в следующем:
Во-первых как быть с именами, которые могут совпасть (ну имена полей в конкретных разделах с глобальными)
Во-вторых, как сделать XSD, которая бы подключала требуемые под-XSD для <content></content> (Если такое вообще возможно).......
А самая непреодолимая преграда состоит в том, что я не могу прдеставить как сделать XSLT. В данный момент я просто обрабатываю процессором отдельно content и его обрамление, но это не есть хорошо....

Изьяснился наверное не очень понятно (я пока не гуру в терминах xml) но надеюсь меня кто-то понял и даст наводки...
спасибо.....
Re: Модуляризация XSLT преобразования
От: Fomka Россия  
Дата: 19.02.04 01:31
Оценка:
Здравствуйте, _dvp, Вы писали:

<skip>

А чем плохи отдельные шаблоны для каждого из видов контента: для форума, новостей и так далее, а в зависимости от какого-нибудь признака (например аттрибута элемента content) вызывать тот или иной шаблон?
Например, если вот такой XML
<content type="news">
........
</content>

создаешь шаблоны
<xsl:template name="news">
  <xsl:param name="items"/>
  ...
</xsl:template>
<xsl:template name="forum">
  <xsl:param name="items"/>
  ...
</xsl:template>

их можно разнести по разным файлам и подключить вот так
<xsl:import href="news.xsl"/>
<xsl:import href="forum.xsl"/>

А в главном XSL файле делаешь
<xsl:template match="content">
        <xsl:choose>
            <xsl:when test="@type = 'news'">
                 <xsl:call-template name="news">
                        <xsl:with-param name="items" select="./*"/>
                  </xsl:call-template>
            </xsl:when>
            <xsl:when test="@type = 'forum'">
                .....
            </xsl:when>
            и так далее
         </xsl:choose>
</xsl:template>

Каждый шаблон знает какие у него должны быть подэлементы и что с ними делать.
Re[2]: Модуляризация XSLT преобразования
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.02.04 08:39
Оценка:
Здравствуйте, Fomka, Вы писали:

F>Здравствуйте, _dvp, Вы писали:


хъ

Не проще ли сделать:
<xsl:template match="content[@name = 'news']">
    .....
</xsl:template>
<xsl:template match="content[@name = 'forum']">
    .....
</xsl:template>
... << RSDN@Home 1.1.3 beta 1 >>
Re: Модуляризация XSLT преобразования
От: Аноним  
Дата: 19.02.04 09:20
Оценка:
_>Проблема в следующем:
_>Во-первых как быть с именами, которые могут совпасть (ну имена полей в конкретных разделах с глобальными)
_>Во-вторых, как сделать XSD, которая бы подключала требуемые под-XSD для <content></content> (Если такое вообще возможно).......
_>А самая непреодолимая преграда состоит в том, что я не могу прдеставить как сделать XSLT. В данный момент я просто обрабатываю процессором отдельно content и его обрамление, но это не есть хорошо....

1. Использовать атрибут mode в <xsl:template>
<xsl:template match="news">
<xsl:apply-templates select="item" mode="news"/>
</xsl:template>
<xsl:template match="item" mode="news">
...
</xsl:template>


2. Использовать более полный путь к элементу в атрибуте match
<xsl:template match="news">
<xsl:apply-templates select="item"/>
</xsl:template>
<xsl:template match="news/item">
...
</xsl:template>


другие решения вроде привели, но лично мне вариант <xsl:template name="name"> сильно не нравится, он больше для рекурсии подходит, хотя я вообще его не использую (врочем как и рекурсию)
Re[2]: Модуляризация XSLT преобразования
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.02.04 11:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

хъ

Ты б зарегистрировался, что-ли...
... << RSDN@Home 1.1.3 beta 1 >>
Re: Модуляризация XSLT преобразования
От: _dvp  
Дата: 19.02.04 12:46
Оценка:
А могу ли я в
<xsl:import href="news.xsl"/>
использовать динамичесое имя. Т.е. вопрос состоит в том, что этот самый <content type="..."> может быть как forum так и news или что-то иное, но полный список заранее неизвестен... т.е. предполагаеться что компоновка сайта может быть любой...

можно ли написаь так:
<xsl:template match="content">
<xsl:import href="{@type}"/>
</xsl:template>

????
Re[3]: Модуляризация XSLT преобразования
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 19.02.04 14:32
Оценка:
AS>Здравствуйте, <Аноним>, Вы писали:

AS>хъ


AS>Ты б зарегистрировался, что-ли...


Да я зарегистрирован, просто забываю постоянно пароль %)
Вот и сейчас не помню, пришлось менять (
Re[2]: Модуляризация XSLT преобразования
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 19.02.04 14:35
Оценка:
_>А могу ли я в
_><xsl:import href="news.xsl"/>
_>использовать динамичесое имя. Т.е. вопрос состоит в том, что этот самый <content type="..."> может быть как forum так и news или что-то иное, но полный список заранее неизвестен... т.е. предполагаеться что компоновка сайта может быть любой...

_>можно ли написаь так:

_><xsl:template match="content">
_> <xsl:import href="{@type}"/>
_></xsl:template>

Нет, лучше подключай все файлы, XSLT в зависимости от входных данных сам разберется какие <xsl:template> вызывать.
Re[3]: Модуляризация XSLT преобразования
От: _dvp  
Дата: 19.02.04 20:54
Оценка:
T>Нет, лучше подключай все файлы, XSLT в зависимости от входных данных сам разберется какие <xsl:template> вызывать.

Это нереально.

Я хочу в итоге избавиться ок какох-либо использований процессоров на сервере, если это пожно сделать на клиенте. Но если я подключу все, то их все придёться качать при каждом просмотре.

Плюс, что наиболее важно, не получиться орагизовать динамическую компановку сайта из разных разделов. Т.е. надор: форум, новости и ещё что-то — будет фиксированным.

Ну так, что? Идей нет? Или это действительно не возможно иными способами кроме как динамическая генерация и стилей тоже?
Re: Модуляризация XSLT преобразования
От: Андрей Майоров Россия http://blogs.byte-force.com/xor
Дата: 05.04.04 08:33
Оценка:
Здравствуйте, _dvp, Вы писали:

Задача понятна только в общих чертах, но отдельные ее моменты всколыхнули какие-то воспоминания.

_>Во-первых как быть с именами, которые могут совпасть (ну имена полей в конкретных разделах с глобальными)


Ввести разные namespace'ы для глобальных и локальных элементов. Как вариант, делать глобальные элементы с нэймспейсом, а локальный — без.

_>Во-вторых, как сделать XSD, которая бы подключала требуемые под-XSD для <content></content> (Если такое вообще возможно).......


Эта проблема, опять же, решается namespace'ами. Если каждый из модулей будет определять свой неймспейс, то для каждого можно будет сделать и свою схему. Тут, конечно, вопрос еще в том, зачем тебе нужна схема.

_>А самая непреодолимая преграда состоит в том, что я не могу прдеставить как сделать XSLT. В данный момент я просто обрабатываю процессором отдельно content и его обрамление, но это не есть хорошо....


Насколько я понял из дальнейших мессаг, ты хочешь динамически набирать XSL из кучи отдельных модулей, причем делать это на клиенте и стандартными средствами. С этим облом: и import, и include не позволяют подставлять динамический источник. С другой стороны, можно сгенерить нужный "оберточный" xsl на сервере. Он будет содержать только некоторое кол-во директив include (или import), и будет запросто загружаться клиентским браузером.

WBR,
XOR
... << RSDN@Home 1.1.0 stable >>
WBR,
XOR // BYTE-force
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.