Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Таблицы HTML и XSL


Автор: starmaster 27.5.2006, 03:03
Ребята, такая проблема, в 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> в условие, то происходит ошибка, потому как эти теги могут и не отобразиться и в результате получатся пропущенные незакрытые теги. Как можно решить такую проблему? 

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

<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 

Автор: starmaster 27.5.2006, 18:59
Большое спасибо за подкинутую идею, только не забывай, что в условиях 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>


Ещё раз большое спасибо за идею! 

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

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

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

Автор: Karabas 21.7.2006, 11:06
Столкнулся с подобной проблемой, и воспользовался этим топиком. Огромное спасибо участникам.  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). 
В моем случае ей вообще ничего не присваивается..   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)