XSL-шаблоны разделить элементы в группу по три штуки

#
XSL-шаблоны разделить элементы в группу по три штуки
как с помощью xls получить такую верстку?
<div class="wrap">
   <div class="box-7">
      1
   </div>
   <div class="box-7">
      2
   </div>
   <div class="box-7">
      3
   </div>
</div>
<div class="wrap">
   <div class="box-7">
      4
   </div>
   <div class="box-7">
      5
   </div>
   <div class="box-7">
      6
   </div>
</div>
#
Re: XSL-шаблоны разделить элементы в группу по три штуки
вводим переменную
<xsl:variable name="n" select="number(3)"/>

вызываем шаблон например для групп
<xsl:apply-templates select=".//informationsystem_group[position() mod $n = 1]"/>

сам шаблон
<xsl:template match="informationsystem_group">
    <div class="wrap">
         <xsl:for-each select=". | following-sibling::informationsystem_group[position() &lt; $n]">
              <div class="box-7">
                   1
              </div>
         </xsl:for-each>
    </div>
</xsl:template>
как то вроде так
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
#
Re: XSL-шаблоны разделить элементы в группу по три штуки
вот что получилось:
xls-шаблон
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
    <!-- СписокЭлементовИнфосистемы -->
    <xsl:template match="/">
        <div class="inset-shadow page-4-row-1 bot-2 border-radius-bottom">
            <xsl:apply-templates select="/informationsystem" />
        </div>
    </xsl:template>
    <xsl:template match="/informationsystem">
        <!-- Получаем ID родительской группы и записываем в переменную $group -->
        <xsl:variable name="group" select="group" />
        <xsl:choose>
            <xsl:when test="group = 0">
                <!-- Если в находимся корне - выводим название информационной системы -->
                   <h1>
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </h1>

                <!-- Описание выводится при отсутствии фильтрации по тэгам -->
                <xsl:if test="count(tag) = 0">
                    <xsl:value-of disable-output-escaping="yes" select="description" /></xsl:if>
            </xsl:when>
            <xsl:otherwise>
                <!-- Если в находимся в группе - выводим название группы -->
                   <h1>
               <xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/name"/>
            </h1>

                <!-- Описание выводим только на первой странице -->
                <xsl:if test="page = 0">
                    <xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/description" /></xsl:if>
                <!-- Путь к группе -->
                <p>
                    <xsl:apply-templates select=".//informationsystem_group[@id=$group]" mode="goup_path" />
                </p>
            </xsl:otherwise>
        </xsl:choose>
        <div class="container">
            <div class="wrapper">
                <!-- Отображение записи информационной системы -->
                <!-- <ul class="list"> -->
                <xsl:variable name="n" select="number(3)" />
                <xsl:apply-templates select="informationsystem_item[active=1 and position() mod $n = 1]" />
                <!-- </ul> -->
            </div>
        </div>
    </xsl:template>
    <!-- Шаблон вывода информационного элемента -->
    <xsl:template match="informationsystem_item">
        <div class="wrap">
            <xsl:for-each select=". | following-sibling::informationsystem_group[position() &lt; $n]">
                <div class="box-7">
                    <div class="left-2">
                        <a href="{url}" class="lightbox-image img-shadow wrap" data-gal="prettyPhoto[1]">
                            <img src="{dir}{image_small}" alt="{name}" />
                        </a>
                    </div>
                    <a href="{url}" class="color-1">
                        <xsl:value-of disable-output-escaping="yes" select="name" />
                    </a>
                    <p>
                        <xsl:value-of disable-output-escaping="yes" select="description" />
                    </p>
                </div>
            </xsl:for-each>
        </div>
    </xsl:template>
</xsl:stylesheet>

в итоге он разбил но в группе только 1 элемент.
А нужно что было 1-3 4-6 7-9 ну и так далее.

я так понимаю что тут он выбирает только третий элементы?
<xsl:apply-templates select=".//informationsystem_group[position() mod $n = 1]"/>

#
Re: XSL-шаблоны разделить элементы в группу по три штуки
А этот код не вызвал ошибки?
ну во-первых выше я написал что это для групп, а вы используете для элементов, тут ошибка
<xsl:for-each select=". | following-sibling::informationsystem_group[position() &lt; $n]">
во-вторых переменную n нужно перенести сюда
...
<xsl:template match="/">
         <div class="inset-shadow page-4-row-1 bot-2 border-radius-bottom">
             <xsl:apply-templates select="/informationsystem" />
         </div>
     </xsl:template>
     <xsl:variable name="n" select="number(3)" />
     <xsl:template match="/informationsystem">
...
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
#
Re: XSL-шаблоны разделить элементы в группу по три штуки
Я так понимаю что должно получить вот так:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
    <!-- СписокЭлементовИнфосистемы -->
    <xsl:template match="/">
        <div class="inset-shadow page-4-row-1 bot-2 border-radius-bottom">
            <xsl:apply-templates select="/informationsystem" />
        </div>
    </xsl:template>
    <xsl:variable name="n" select="number(3)"/>
    <xsl:template match="/informationsystem">
        <!-- Получаем ID родительской группы и записываем в переменную $group -->
        <xsl:variable name="group" select="group" />
        <xsl:choose>
            <xsl:when test="group = 0">
                <!-- Если в находимся корне - выводим название информационной системы -->
                   <h1>
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </h1>

                <!-- Описание выводится при отсутствии фильтрации по тэгам -->
                <xsl:if test="count(tag) = 0">
                    <xsl:value-of disable-output-escaping="yes" select="description" /></xsl:if>
            </xsl:when>
            <xsl:otherwise>
                <!-- Если в находимся в группе - выводим название группы -->
                   <h1>
               <xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/name"/>
            </h1>

                <!-- Описание выводим только на первой странице -->
                <xsl:if test="page = 0">
                    <xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/description" /></xsl:if>
                <!-- Путь к группе -->
                <p>
                    <xsl:apply-templates select=".//informationsystem_group[@id=$group]" mode="goup_path" />
                </p>
            </xsl:otherwise>
        </xsl:choose>
        <div class="container">
            <div class="wrapper">
                <!-- Отображение записи информационной системы -->
                <!-- <ul class="list"> -->
                
                <xsl:apply-templates select="informationsystem_item[position() mod $n = 1]" />
                <!-- </ul> -->
            </div>
        </div>
    </xsl:template>
    <!-- Шаблон вывода информационного элемента -->
    <xsl:template match="informationsystem_item">
        <div class="wrap">
         <xsl:for-each select=". | following-sibling[position() &lt; $n]">
              <div class="box-7">
                   <div class="left-2">
                <a href="{url}" class="lightbox-image img-shadow wrap" data-gal="prettyPhoto[1]">
                    <img src="{dir}{image_small}" alt="{name}" />
                </a>
            </div>
            <a href="{url}" class="color-1">
                <xsl:value-of disable-output-escaping="yes" select="name" />
            </a>
            <p>
                <xsl:value-of disable-output-escaping="yes" select="description" />
            </p>
              </div>
         </xsl:for-each>
       </div>

    </xsl:template>
</xsl:stylesheet>

ошибок опять нет но результат тот же.
#
Re: XSL-шаблоны разделить элементы в группу по три штуки
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <!-- СписокНовостейНаГлавной -->
   
   <xsl:template match="/">
      
      <xsl:apply-templates select="/informationsystem"/>
      
   </xsl:template>
   
   <xsl:variable name="n" select="number(3)" />
   
   <xsl:template match="/informationsystem">
      
      <!-- Отображение записи информационной системы -->
      <xsl:if test="informationsystem_item">
         <div class="container-two">
            <div class="wrapper-two">
               <xsl:apply-templates select="informationsystem_item[active=1 and position() mod $n = 1]"/>
            </div>
         </div>
      </xsl:if>
      
   </xsl:template>
   
   <!-- Шаблон вывода информационного элемента -->
   <xsl:template match="informationsystem_item">
      <div class="wrap">
         <xsl:for-each select=". | following-sibling::informationsystem_item[position() &lt; $n]">
            <div class="box-7">
               <a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="informationsystem_item">
                  <xsl:value-of disable-output-escaping="yes" select="name"/>
               </a>
            </div>
         </xsl:for-each>
      </div>
   </xsl:template>
</xsl:stylesheet>
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
#
Re: XSL-шаблоны разделить элементы в группу по три штуки
все дело в волшебных пузырьках
following-sibling::informationsystem_item[position() &lt; $n]

спасибо заработало!
но я до конца не понял почему.
Можно краткое описание к этой конструкции или ссылку на доходчивое описание.
Нет я конечно понимаю что с помощью нее мы группируем элементы но почему они группируются по при когда мы в условии пишем меньше трех.
Или я не правильно понял условие?
#
Re: XSL-шаблоны разделить элементы в группу по три штуки

following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.

ну как я понял если меньше 3, то на 4 "брате" элемента возвращаемся обратно
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
Авторизация