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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таблицы HTML и XSL 
:(
    Опции темы
starmaster
Дата 27.5.2006, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята, такая проблема, в xml файле есть некоторое количество упорядоченных по тегу <item> данных, в xsl нужно вывести эти данные в таблицу HTML, делаем стандартно:

<table>
 <tr>
<xsl:for-each select="/root/tag/item">
 <td><xsl:value-of select="."/></td>
</xsl:for-each>
 </tr>
</table>

Но вся проблема в том, что к примеру мне нужно на ряд 4 ячейки, а потом перенос на новую строку и продолжение там. Если я поставлю теги <tr> </tr> в условие, то происходит ошибка, потому как эти теги могут и не отобразиться и в результате получатся пропущенные незакрытые теги. Как можно решить такую проблему? 
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 27.5.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну если не нагромождать рекурсии, то можно попробовать так:
Код

<table>
  <xsl:for-each select="(/root/tag/item)[position() mod 4 =1]">
    <tr>
      <xsl:variable name="startpos" select="position()"/>
      <xsl:for-each select="(/root/tag/item)[position()>=startpos and position()<startpos+4]">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:for-each>
    </tr>
  </xsl:for-each>
</table>

правда, не тестировал, но вроде должно работать

Добавлено @ 10:27 
Цитата(maxim1000 @  27.5.2006,  09:24 Найти цитируемый пост)
<xsl:variable name="startpos" select="position()"/>

кстати, вот тут не уверен
по идее, position() здесь будет обозначать порядковый номер уже в наборе с номерами кратными 4
так что надо будет сделать что-то типа position()*4 - 3 


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


Шустрый
*


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

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



Большое спасибо за подкинутую идею, только не забывай, что в условиях xsl: >= - &gt;= < - &lt; И также не забывай указывать перед переменными знак доллара '$'. И вместо position() надо было указать current():

Код

<table>
  <xsl:for-each select="(/root/tag/item)[position() mod 4 = 1]">
    <tr>
      <xsl:variable name="startpos" select="current()"/>
      <xsl:for-each select="(/root/tag/item)[position()&gt;=$startpos and position()&lt;$startpos+4]">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:for-each>
    </tr>
  </xsl:for-each>
</table>


Ещё раз большое спасибо за идею! 
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 27.5.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(starmaster @  27.5.2006, 17:59 Найти цитируемый пост)
только не забывай, что в условиях xsl: >= - >= < - < И также не забывай указывать перед переменными знак доллара '$'.

сказывается небольшой перерыв в работе с XSL smile
Цитата(starmaster @  27.5.2006, 17:59 Найти цитируемый пост)
И вместо position() надо было указать current():

а вот тут не очень понятно... current() возвращает список узлов по идее, здесь нужна position(), которая возвращает порядковый номер текущего узла в обрабатываемом списке... 


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


Новичок



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

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



Столкнулся с подобной проблемой, и воспользовался этим топиком. Огромное спасибо участникам.  smile 
smile  В моем случае заработала вот такая конструкция:
Код

<table>
    <xsl:for-each select="(/root/tag/item)[position() mod 4 = 1]">
        <tr>
        <xsl:variable name="startpos" select="position()*4-3"/>
        <xsl:for-each select="(/root/tag/item)[position()&gt;=$startpos and position()&lt;$startpos+4]">
            <td>
                <xsl:value-of select="."/>
            </td>
        </xsl:for-each>
    </tr>
</xsl:for-each>
</table>

Отличие от предыдущего поста: при объявлении переменной 'startpos' функция current() не работает (как правильно заметил maxim1000). 
В моем случае ей вообще ничего не присваивается..   
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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