Оптимизация XSLT-кода

#
Оптимизация XSLT-кода
Добрый день! Хочу в разделе каталога интернет-магазина вывести список ссылок на товары 2 списками, причем чтобы товары шли в таком порядке: в первый список попали товары с 1-го по n/2, а во второй с n/2+1 до n. Понимаю, что это должно делаться как-то просто, но не могу сообразить как. В итоге сделал достаточно топорным способом, только чтобы работало.


...

<xsl:template match="/shop">

   ...

   <xsl:variable name="half" select="ceiling(total div 2)"/>
   
   <section id="goods-list" class="clearer">
      <ul>
         <xsl:apply-templates select="shop_item">
            <xsl:sort select="sorting" data-type="number" />
            <xsl:with-param name="half" select="$half"/>
         </xsl:apply-templates>
      </ul>
      <ul>
         <xsl:apply-templates select="shop_item" mode="second">
            <xsl:sort select="sorting" data-type="number" />
            <xsl:with-param name="half" select="$half"/>
         </xsl:apply-templates>
      </ul>
   </section>
</xsl:template>

<xsl:template match="shop_item">
   <xsl:param name="half" />
   <xsl:if test="position() &lt;= $half">
      <li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
      </a></li>
   </xsl:if>
</xsl:template>
<xsl:template match="shop_item" mode="second">
   <xsl:param name="half" />
   <xsl:if test="position() &gt; $half">
      <li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
      </a></li>
   </xsl:if>
</xsl:template>


Помогите упростить этот ужас, ведь должно быть все намного проще и элегантнее.
#
Re: Оптимизация XSLT-кода
1) В шаблонах <xsl:template match="shop_item"> и <xsl:template match="shop_item" mode="second"> position() будет возвращать 1

2) Логику выбора "половинок" нужно перенести в <xsl:apply-templates ..>. Например, можно попробовать так:

<xsl:template match="/shop">

   ...

   <xsl:variable name="half" select="ceiling(total div 2)"/>
  
   <section id="goods-list" class="clearer">
      <ul>
         <xsl:apply-templates select="shop_item[position() &lt;= $half]">
            <xsl:sort select="sorting" data-type="number" />
         </xsl:apply-templates>
      </ul>
      <ul>
         <xsl:apply-templates select="shop_item[position() &gt; $half]">
            <xsl:sort select="sorting" data-type="number" />
         </xsl:apply-templates>
      </ul>
   </section>
</xsl:template>

<xsl:template match="shop_item">
   <li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
       <xsl:value-of disable-output-escaping="yes" select="name"/>
   </a></li>
</xsl:template>


3) сразу не заметил: сортировка по полю sorting будет в уже отобранных коллекциях элементов, поэтому лучше переписать через <xsl:for-each>
<xsl:template match="/shop">

   ...

   <xsl:variable name="half" select="ceiling(total div 2)"/>
  
   <section id="goods-list" class="clearer">
      <ul>
         <xsl:for-each select="shop_item">
            <xsl:sort select="sorting" data-type="number" />
            <xsl:if test="position() &lt;= $half">
               <xsl:apply-templates select="."/>
            </xsl:if>
         </xsl:for-each>
      </ul>
      <ul>
         <xsl:for-each select="shop_item">
            <xsl:sort select="sorting" data-type="number" />
            <xsl:if test="position() &gt; $half">
               <xsl:apply-templates select="."/>
            </xsl:if>
         </xsl:for-each>
      </ul>
   </section>
</xsl:template>

<xsl:template match="shop_item">
   <li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
       <xsl:value-of disable-output-escaping="yes" select="name"/>
   </a></li>
</xsl:template>


4) существенным недостатком в п.3 является проход по всем элементам переданным в xml, поэтому лучше перевести сортировку в контроллер показа и использовать решение из п.2 (с убранной сортировкой)
ARTatom
#
Re: Оптимизация XSLT-кода
Если не нужна поддержка древних ие, то можно вообще сделать через css columns c фалбеком на float.

https://jsfiddle.net/am9az9ts/
Email: roman.fov@gmail.com Skype: roman-fov
Авторизация