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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменная счетчик... Как это сделать? 
:(
    Опции темы
t77
Дата 23.3.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток.
Очень необходимо создать переменную и увеличивать ее значение при необходимости на один.
Что то вроде increment.

Поясню немного, что именно мне необходимо сделать...
Прохожусь в for-each по всем нодам(элементам) ХМЛ файла. У всех нодов имеется атрибут isAnchor, и значение этого атрибута может быть - true или false. 
если значение атрибута isAnchor = true, то распечатываю название нода на страничке внутри определенного DIV-а.
До сих пор все достаточно тривиально и работает как положенно!
Вопрос или проблемка заключается в том, что необходимо после каждого 5-ого распечатываемого нода перейти на новую строку.Тоесть в каждой строке DIV-а должно быть не больше и не меньше 5-и названий.
Пример:
Код

<node1 isAnchor="true"/>
<node2 isAnchor="false"/>
<node3 isAnchor="true"/>
<node4 isAnchor="true"/>
<node5 isAnchor="false"/>
<node6 isAnchor="true"/>
<node7 isAnchor="false"/>
<node8 isAnchor="true"/>
<node9 isAnchor="true"/>
<node10 isAnchor="true"/>
<node11 isAnchor="true"/>
<node12 isAnchor="true"/>
<node13 isAnchor="true"/>
...
...
...

Желаемый результат должен быть:
Код

node1 | node3 | node4 | node6 | node8
node9 | node10 | node 11 | node 12 | node 13


Думаю, что мне необходимо проверять условие: 
Код

<xsl:if test="ПеременнаяСчетчик mod 5">
        <!- новая строка -->
        </br>
</xsl:if>

Но как и где мне создать эту ПеременнуюСчетчик, и при необходимости увеличивать ее значение и обнулить потом ?
Возможно ли такое в XSL ?  Если да, то как ?

PM MAIL   Вверх
jsa
Дата 26.3.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



примерно так 
Код

<xsl:template match="/root">
    <xsl:variable name="list" select="*" />
    <xsl:variable name="next" select="$list[1]" />

    <xsl:call-template name="while">        
        <xsl:with-param name="list" select="$list"/>
        <xsl:with-param name="next" select="$next"/>
        <xsl:with-param name="cnt" select="1" />
        <xsl:with-param name="pos" select="1" />
    </xsl:call-template>

</xsl:template>

<xsl:template name="while">
    <xsl:param name="list" />
    <xsl:param name="next" />
    <xsl:param name="cnt" />
    <xsl:param name="pos" />
    
    <xsl:choose>
        <xsl:when test="$next/@isAncor = 'true'">
            <xsl:value-of select="local-name(.)" />
            <xsl:text>|</xsl:text>
            
            <xsl:variable name="counter">
                <xsl:choose>
                    <xsl:when test="$cnt + 1 > 5">
                        <xsl:value-of select="'1'" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="$cnt + 1" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            
            <xsl:if test="$cnt + 1 > 5">
                <br />
            </xsl:if>
            <xsl:if test="count($list) &lt; $pos">
                <xsl:call-template name="while">
                    <xsl:with-param name="list" select="$list"/>
                    <xsl:with-param name="next" select="$list[$pos + 1]"/>
                    <xsl:with-param name="cnt" select="$counter" />
                    <xsl:with-param name="pos" select="$pos + 1" />
                </xsl:call-template>
            </xsl:if>
        </xsl:when>    
        <xsl:otherwise>
            <xsl:if test="count($list) &lt; $pos">
                <xsl:call-template name="while">
                    <xsl:with-param name="list" select="$list"/>
                    <xsl:with-param name="next" select="$list[$pos + 1]"/>
                    <xsl:with-param name="cnt" select="$cnt" />
                    <xsl:with-param name="pos" select="$pos + 1" />
                </xsl:call-template>
            </xsl:if>
        </xsl:otherwise>
    </xsl:choose>
    
</xsl:template>

</xsl:stylesheet>




xml
Код

<root>
    <node1 isAnchor="true"/>
    <node2 isAnchor="false"/>
    <node3 isAnchor="true"/>
    <node4 isAnchor="true"/>
    <node5 isAnchor="false"/>
    <node6 isAnchor="true"/>
    <node7 isAnchor="false"/>
    <node8 isAnchor="true"/>
    <node9 isAnchor="true"/>
    <node10 isAnchor="true"/>
    <node11 isAnchor="true"/>
    <node12 isAnchor="true"/>
    <node13 isAnchor="true"/>

</root>


Добавлено через 12 минут и 10 секунд
сорри вот версия без ошибок
Код

<xsl:template match="root">
    <xsl:variable name="list" select="/root/descendant::*" />
    <xsl:variable name="next" select="$list[1]" />
    
    <xsl:call-template name="while">        
        <xsl:with-param name="list" select="$list"/>
        <xsl:with-param name="next" select="$next"/>
        <xsl:with-param name="cnt" select="1" />
        <xsl:with-param name="pos" select="1" />
    </xsl:call-template>

</xsl:template>

<xsl:template name="while">
    <xsl:param name="list" />
    <xsl:param name="next" />
    <xsl:param name="cnt" />
    <xsl:param name="pos" />



    <xsl:choose>
        <xsl:when test="$next/@isAnchor = 'true'">
            <xsl:value-of select="local-name($next)" />
            <xsl:text> | </xsl:text>
            
            <xsl:variable name="counter">
                <xsl:choose>
                    <xsl:when test="$cnt + 1 > 5">
                        <xsl:value-of select="1" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="$cnt + 1" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            
            <xsl:if test="$cnt + 1 &gt; 5">
                <br />
            </xsl:if>
            <xsl:if test="count($list) &gt; $pos">
                <xsl:call-template name="while">
                    <xsl:with-param name="list" select="$list"/>
                    <xsl:with-param name="next" select="$list[$pos + 1]"/>
                    <xsl:with-param name="cnt" select="$counter" />
                    <xsl:with-param name="pos" select="$pos + 1" />
                </xsl:call-template>
            </xsl:if>
        </xsl:when>    
        <xsl:otherwise>
            <xsl:if test="count($list) &gt; $pos">
                <xsl:call-template name="while">
                    <xsl:with-param name="list" select="$list"/>
                    <xsl:with-param name="next" select="$list[$pos + 1]"/>
                    <xsl:with-param name="cnt" select="$cnt" />
                    <xsl:with-param name="pos" select="$pos + 1" />
                </xsl:call-template>
            </xsl:if>
        </xsl:otherwise>
    </xsl:choose>
    
</xsl:template>



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Logovo
Дата 16.5.2013, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Похожая беда...

Код

<ul class="news">
                    <xsl:for-each select="/page/element[@type='WideSite.Elements.News']/list/item">
                        <xsl:if test="@type_alias = 'news' ">
                            <xsl:if test="13>=position()">
                            <li>
                            <p>
                            <!--    <xsl:if test="position() = 1 and @type_alias = 'updates'">
                                    <xsl:attribute name="class">update-critical</xsl:attribute>
                                </xsl:if>
                                            -->
                                
                                <xsl:if test="position() = 1 and @type_alias = 'news'">
                                    <xsl:attribute name="class">news-critical</xsl:attribute>
                                </xsl:if>
                                <xsl:if test="@type_alias = 'news' and position() != 1">
                                    <xsl:attribute name="class">news</xsl:attribute>
                                </xsl:if>
                              <a href="company/news/default.ivp?news_id={@id}">
                                <xsl:value-of select="@title" />
                              </a>
                            </p>
                            <span>
                              <xsl:value-of select="date/@day0"/>.<xsl:value-of select="date/@month0"/>.<xsl:value-of select="date/@year"/>
                            </span>
                            <div class="clear"></div>
                          </li>
                        </xsl:if></xsl:if>
                      </xsl:for-each>
                    </ul>


Суть его - вывод двух категорий новостей, при чем первая новость - стилями картинка другого цвета.
Назрела необходимость вывода тлько одной категории, news

Я "ловко" решил этот момент, отфильтровав вывод только категории news 
Код

<xsl:if test="@type_alias = 'news' ">

но на этом проблема не решена до конца.

Необходимо выводить 14 новостей, а так как фильтр отсеивает, выводится меньше.
И как поймать момент первого вывода, чтобы прикрутить стиль?

Вижу два решения :
1)

на php я бы сделал так 

Код


[color=red]<?php 
$i=0; 
?>
[/color]

<xsl:for-each select="/page/element[@type='WideSite.Elements.News']/list/item">
                        <xsl:if test="@type_alias = 'news' ">
                        <!--    <xsl:if test="13>=position()"> -->

                                            <?php if ($i <= 13) { ?>
        <li>
                            <p>
                            <!--    <xsl:if test="position() = 1 and @type_alias = 'updates'">
                                    <xsl:attribute name="class">update-critical</xsl:attribute>
                                </xsl:if>
                                            -->
        [color=red]<?php if ($i=0) {            ?>    [/color]        
                                <xsl:if test="position() = 1 and @type_alias = 'news'">
                                    <xsl:attribute name="class">news-critical</xsl:attribute>
                                </xsl:if>

[color=red]<?php } ?>[/color]
                                <xsl:if test="@type_alias = 'news' ">
                                    <xsl:attribute name="class">news</xsl:attribute>
                                </xsl:if>
                              <a href="company/news/default.ivp?news_id={@id}">
                                <xsl:value-of select="@title" />
                              </a>
                            </p>
                            <span>
                              <xsl:value-of select="date/@day0"/>.<xsl:value-of select="date/@month0"/>.<xsl:value-of select="date/@year"/>
                            </span>
                            <div class="clear"></div>
                          </li>
                        </xsl:if></xsl:if>

[color=red]<?php } $i++; ?>[/color]

                      </xsl:for-each>
                   


либо вызбирать только новости с алиасом news, только я нуб в этом.

Поскажите куда двигаться?
PM MAIL   Вверх
diadiavova
Дата 16.5.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Logovo, я из твоего объяснения не понял ровным счетом ничего. Если хочешь, чтобы тебе помогли, формулируй задачу исходя из того, что читающий о твоем проекте ничего не знает. Опиши исходных документ, как данные из этого документа должны проецироваться на результат, а код надо приводить для того, чтобы пояснить написанное текстом, а не для того, чтобы глядя на него надо было догадаться, что тебе надо. Ну и пихать свой вопрос в старую тему, которая если и имеет отношение к твоему вопросу, то только косвенное - тоже плохая идея.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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