Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наращивание перемменной во вложеных циклах XSL 
V
    Опции темы
pawlenty
Дата 7.5.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



<data>
    <item id="i1"    sector="s1"    subsector="u1">561</item>
       ..................
            <пункты могуть быть с различными комбинациями s и u>
       .................. 
    <item id="i251"    sector="s2"    subsector="u2">632</item>
    <item id="i252"    sector="s2"    subsector="u3">980</item>
    <item id="i253"    sector="s1"    subsector="u4">689</item>
    <item id="i254"    sector="s2"    subsector="u5">641</item>
    <item id="i255"    sector="s4"    subsector="u4">314</item>
    
    <sector id="s1">Sector 1</sector>
    <sector id="s2">Sector 2</sector>
    <sector id="s3">Sector 3</sector>

    <subsector id="u1">Subsector 1</subsector>
    <subsector id="u2">Subsector 2</subsector>
    <subsector id="u3">Subsector 3</subsector>
    <subsector id="u4">Subsector 4</subsector>
    <subsector id="u5">Subsector 5</subsector>
</data>

нужно вывести так:
Sector 1
    Subsector 1
       idValue    Value
       и. т. д.

все это просто делается тремя вложеными циклами for-each, НО!!!

Нужно еще вставить разделители страниц! Должно быть не более 25 item-ов (idValue    Value) на странице, а разделители страниц можно вставлять только между (Sector/Subsector, внутри Subsector - нельзя). Понятно, что нужно считать колличество (idValue    Value)  каждого Subsector и складывать с предудущим, чтобы проверить. Но "силами" xsl  не могу никак сделать. Пробовал и с рекурсией мутить, но я с XSL только 2ой разбираюсь, может кто подскажет хотя бы идею...
PM MAIL   Вверх
maxim1000
Дата 7.5.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 7
Всего: 110



ну, во-первых, переходим на рекурсивный обход всех комбинаций sector/subsector
для этого делаем шаблон с двумя параметрами: порядковый номер sector's и порядковый номер subsector'a
при каждом вызове выводим соответствующий список item
потом вызываем этот же шаблон, увеличивая номер subsector
если доходим до конца - сбрасываем subsector и увеличиваем sector
когда мы выводим элементы первый раз для этого sector, также выводим его заголовок
кроме того, после каждого вывода блока item обновляем счётчик строк (он передаётся в качестве параметра), и в зависимости от него ставим разделитель (я ставил <hr/>)
Код

  <xsl:template match="data">
    <xsl:call-template name="PagedOutput"/>
  </xsl:template>
  <xsl:template name="PagedOutput">
    <xsl:param name="sector" select="1"/>
    <xsl:param name="subsector" select="1"/>
    <xsl:param name="lines" select="0"/>
    <xsl:param name="firstsubsector" select="1"/>
    <xsl:choose>
      <xsl:when test="$sector=count(sector)">
        <!-- do nothing -->
      </xsl:when>
      <xsl:when test="$subsector=count(subsector)">
        <xsl:call-template name="PagedOutput">
          <xsl:with-param name="sector" select="$sector+1"/>
          <xsl:with-param name="subsector" select="1"/>
          <xsl:with-param name="lines" select="$lines"/>
          <xsl:with-param name="firstsubsector" select="1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="sectorid" select="sector[$sector]/@id"/>
        <xsl:variable name="subsectorid" select="subsector[$subsector]/@id"/>
        <xsl:variable name="items"
                      select="item[@sector=$sectorid][@subsector=$subsectorid]"/>
        <xsl:variable name="pagebreak" select="$lines+count($items)>3 and $lines>0"/>
        <xsl:if test="$pagebreak">
          <hr/>
        </xsl:if>
        <xsl:if test="$items">
          <xsl:if test="$firstsubsector=1">
            Sector <xsl:value-of select="sector[$sector]/@id"/><br/>
          </xsl:if>
          -- Subsector <xsl:value-of select="subsector[$subsector]/@id"/><br/>
          <xsl:for-each select="$items">
            -- -- Item <xsl:value-of select="@id"/><br/>
          </xsl:for-each>
        </xsl:if>
        <xsl:call-template name="PagedOutput">
          <xsl:with-param name="sector" select="$sector"/>
          <xsl:with-param name="subsector" select="$subsector+1"/>
          <xsl:with-param name="lines">
            <xsl:if test="not($pagebreak)">
              <xsl:value-of select="$lines+count($items)"/>
            </xsl:if>
            <xsl:if test="$pagebreak">
              <xsl:value-of select="count($items)"/>
            </xsl:if>
          </xsl:with-param>
          <xsl:with-param name="firstsubsector">
            <xsl:if test="$items">0</xsl:if>
            <xsl:if test="not($items)">
              <xsl:value-of select="$firstsubsector"/>
            </xsl:if>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 


--------------------
qqq
PM WWW   Вверх
pawlenty
Дата 7.5.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Ух ты!!! Вообще суппер!!! Мощная вещь рекурсия, только вот заметил еще один подвох. У меня есть items 

<item id="i201"    sector="s5"    subsector="u6">314</item>, а в полях <sector> нет s5, и нет u6 в <subsector> - то есть такие поля нужно перепрыгивать 
PM MAIL   Вверх
pawlenty
Дата 7.5.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Все!!! Большое спасибо - сам разобрался smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

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

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.