установка нескольких XML/XSL-блоков на "страницу" - вопросы...

jer

...
установка нескольких XML/XSL-блоков на "страницу" - вопросы...

Есть движок сайта, в котором страницы собираются из блоков. Для каждого блока есть XML и соответственно XSL. Cначала все блоки собираются в единый XML и XSL документ, а потом парсятся в HTML. Все достаточно стандартно и просто.

Так вот, есть такая проблема:

при "установке" на страницу несколько одинаковых блоков, но с разными настройками, получается, что появляются два XML блока с разными данными, но с одинаковой структурой, и два совершенно идентичных XSL-блока.
при трансформации соот-но каждый XSL-блок выводит каждый XML-блок, что не есть верно, с точки зрения работы движка. Нужно чтобы соответствующий XSLT-блок выводил только свой XML-блок.

например:
XML:
PHP:
<newslist>
  <news id="1">
    <name>название1</name>
    <desc>1бла-бла-бла...</desc>
  </news>
  <news id="2">
    <name>название2</name>
    <desc>2бла-бла-бла...</desc>
  </news>
</newslist>
и

PHP:
<newslist>
  <news id="3">
    <name>название3</name>
    <desc>3бла-бла-бла...</desc>
  </news>
  <news id="8">
    <name>название8</name>
    <desc>8бла-бла-бла...</desc>
  </news>
</newslist>
XSL (изначально одинаковый для обоих блоков):

PHP:
<xsl:template match="newslist">
  News list:
  <xsl:apply-templates select="news"/>
</xsl:template>

<xsl:template match="news">
  <xsl:value-of select="name"/>
  <p><xsl:value-of select="desc"/></p>
</xsl:template>
ситуация пока не частая и решаю ее путем исправления ручками одинаковых XSL-блоков. хочется этот процесс автоматизировать и при том грамотно!.

хотелось бы узнать как другие справляются с этим? и может я в самом подходе к проблеме в чем то ошибаюсь? в XSLT еще далеко не гуру.
 

chameleon

Новичок
ну введи еще и mode какой-нить.
xml:
PHP:
<newslist mode="one">
  <news id="1">
    <name>название1</name>
    <desc>1бла-бла-бла...</desc>
  </news>
  <news id="2">
    <name>название2</name>
    <desc>2бла-бла-бла...</desc>
  </news>
</newslist>
xslt:
PHP:
<xsl:template match="newslist[@mode='one']">
  News list:
  <xsl:apply-templates select="news" mode="one"/>
</xsl:template>

<xsl:template match="news"  mode="one">
  <xsl:value-of select="name"/>
  <p><xsl:value-of select="desc"/></p>
</xsl:template>
в общем и целом читай про диспетчеризацию (templates dispatching).
 

jer

...
да, я через mode как раз и делаю сейчас ;)
только его ручками каждый раз добавляю в совпадающие XSL-шаблоны, а хотелось как-то это автоматизировать
понятно, что можно загрузить XSL в DOM и добавить mode к узлам, но мне показалось это как-то громоздко. неужели все только так решают эту задачу?

>в общем и целом читай про диспетчеризацию (templates dispatching).

не смог найти по этим фразам ни в Yandex, ни в Google ничего в контексте моей задачи ;(((
ткни пальцем, плиз...
или на словах, что ты имел в виду?
 

Orlis

Guest
для подобных вещей есть "xml namespace" вот и гугли по нему
 

chameleon

Новичок
что можно загрузить XSL в DOM и добавить mode к узлам
это еще зачем? mode в xslt должен присутствовать изначально, а в xml как раз динамически назначаться...
ткни пальцем, плиз
я имел ввиду примерно такое: http://sources.redhat.com/ml/xsl-list/2001-03/msg00017.html
 

jer

...
сорри что не сразу ответил, как говорится "перечитывал пейджер. много думал..." (c) анек. ;)

это еще зачем? mode в xslt должен присутствовать изначально, а в xml как раз динамически назначаться...
т.к. генератор xml у меня не знал о кол-ве подобных блоков, то все блоки получались одинаковые по структуре:

PHP:
<newslist>
  <news id="1">
    <name>название1</name>
    <desc>1бла-бла-бла...</desc>
  </news>
  <news id="2">
    <name>название2</name>
    <desc>2бла-бла-бла...</desc>
  </news>
</newslist>

<newslist>
  <news id="3">
    <name>название3</name>
    <desc>3бла-бла-бла...</desc>
  </news>
  <news id="8">
    <name>название8</name>
    <desc>8бла-бла-бла...</desc>
  </news>
</newslist>
а в xsl я примерно так извращался:

PHP:
<xsl:template match="newslist">
  News list:
  <xsl:apply-templates select="news" mode="one"/>
</xsl:template>

<xsl:template match="news"  mode="one">
  <xsl:value-of select="name"/>
  <p><xsl:value-of select="desc"/></p>
</xsl:template>


<xsl:template match="newslist" mode="two">
  News list:
  <xsl:apply-templates select="news" mode="two"/>
</xsl:template>

<xsl:template match="news"  mode="two">
  <xsl:value-of select="name"/>
  <p><xsl:value-of select="desc"/></p>
</xsl:template>



<xsl:apply-templates select="newslist[1]" mode="one"/>
<xsl:apply-templates select="newslist[2]" mode="two"/>
если не вру по памяти ...

спасибо за ссылки! пошел дальше думать :)
 
Сверху