UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: NOIRMAN от 13 Ноября 2011, 16:51:55

Название: Формирование таблицы
Отправлено: NOIRMAN от 13 Ноября 2011, 16:51:55
Впал я что то в ступор. Необходимо сформировать таблицу через usel запрос.

Вызываем в необходимом месте сам запрос
<table>
   <xsl:apply-templates select="document('usel://want-table')//udata" mode="table" />
</table>
Далее стоит вопрос динамического распределения таблицы
<xsl:template match="udata" mode="table">
   <xsl:apply-templates select="page" mode="table" />
</xsl:template>

<xsl:template match="page" mode="table">
   <td>Вывод необходимой информации</td>
   <xsl:if test="not ( position() mod 3 = 1)">
      <td class="razdelitel"></td>
   </xsl:if>
</xsl:template>

А вопрос в следующем - как вставить необходимые <tr></tr> самих строк, для корректной работы скрипта?
Название: Re:Формирование таблицы
Отправлено: NOIRMAN от 13 Ноября 2011, 18:30:31
Решение нашлось. Может кому то поможет сей ресурс - http://ref.leechy.ru/xslt/ (да простит меня админ).

В итоге что у меня получилось (вдруг кто заинтересуется) -
Цитировать
<table>
   <tr>
      <xsl:apply-templates select="document('usel://want-table')//udata" mode="table" />
   </tr>
</table>

<xsl:template match="udata" mode="table">
   <xsl:apply-templates select="page" mode="table" />
</xsl:template>

<xsl:template match="page" mode="table">
   <td>Вывод необходимой информации</td>
   <xsl:if test="not ( position() mod 3 = 0)"> <!-- Вывод некоего разделителя между ячейками, для последней (3-й) ячейки не нужен -->
      <td class="razdelitel"></td>
   </xsl:if>

   <xsl:if test="(position() mod 3 = 0) and not(position() = last())">
   <xsl:text disable-output-escaping="yes"><![CDATA[</tr><tr>]]></xsl:text>
   </xsl:if>
</xsl:template>
Название: Re:Формирование таблицы
Отправлено: admin от 14 Ноября 2011, 05:26:36
как вариант, вот еще один вариант

<xsl:apply-templates select="document('usel://want-table')//udata" mode="table" /> <!--вызов usel-->

<xsl:template match="udata" mode="table" /> <!--для сутиации когда usel ничего не вернул-->

<xsl:template match="udata[total]" mode="table">
<table>
<tr>
<xsl:apply-templates select="page" mode="table" />
</tr>
</table>
</xsl:template>

<xsl:template match="page" mode="table"> <!-- основной шаблон для td-->
<td>Вывод необходимой информации</td>
<xsl:apply-templates select="." mode="table_in" />
</xsl:template>

<xsl:template match="page" mode="table_in"> <!-- основной шаблон для td-->
<td class="razdelitel"></td>
</xsl:template>

<xsl:template match="page[(position() mod 3 = 0) and not(position() = last())]" mode="table_in"> <!-- шаблон для каждой 3 td кроме последней-->
<xsl:text disable-output-escaping="yes"><![CDATA[</tr><tr>]]></xsl:text>
</xsl:template>

возможно, проще было бы делать через блоки <div>, тогда у нас получилось бы

<xsl:apply-templates select="document('usel://want-table')//udata" mode="table" /> <!--вызов usel-->

<xsl:template match="udata" mode="table" /> <!--для сутиации когда usel ничего не вернул-->

<xsl:template match="udata[total]" mode="table">
<div class="conteiner">
<xsl:apply-templates select="page" mode="table" />
</div>
</xsl:template>

<xsl:template match="page" mode="table"> <!-- основной шаблон для td-->
<div class="razdelitel">Вывод необходимой информации</div>
</xsl:template>

<xsl:template match="page[(position() mod 3 = 0) and not(position() = last())]" mode="table"> <!-- шаблон для каждой 3 td кроме последней-->
<div class="razdelitel third">Вывод необходимой информации</div>
<!-- а если целью является перенос строки после 3 элементов, то можно вместо стиля third сразу прописать clear:both -->
<!-- <div class="razdelitel">Вывод необходимой информации</div>
<div style="clear:both;"> -->
</xsl:template>

конечно у класса .razdelitel должны быть стили вроде такого:
.razdelitel{float:left; width:200px;}