XSLT - Выводим элементы в несколько колонок.

 

Очень часто возникает необходимость вывести информацию (картинки, ссылки на файлы, просто блоки текста) в несколько колонок. Если мы имеем однотипные записи

Пример:

<image title="One"/>
<image title="Wto"/>
<image title="Three"/>

И хотим вывести их в таблицу в две колонки. То в XSL шаблоне нам достаточно сделать двойной цикл.

1 Для вывода записей построчно:

Пример:

<table>
<xsl:variable name="num_cols" select="2"/>
<xsl:for-each
select="image[position() = 1 or position() mod $num_cols = 1]">
 <tr>
 <xsl:for-each
select=".|following-sibling::image[position() &lt; $num_cols]">
<td>
<xsl:value-of "@title" />
</td>
</xsl:for-each>
  </tr>
</xsl:for-each>
</table>

На выходе мы получим

Пример:

<table>
 <tr>
<td> One </td>
<td> Two </td>
</tr>
<tr>
<td> Three </td>
</tr>
</table>

Для вывода записей пополосно:

Пример:

<table> 
<tr>
<xsl:variable name="num_cols" select="4"/>
<xsl:variable name="num_rows" select="count(./image) div $num_cols"/>
<xsl:for-each select="image[position() = 1 or position() mod $num_rows = 1]">
<xsl:for-each select=".|following-sibling::image[position() &lt; $num_rows]">
<td>
<xsl:value-of "@title" />
</td>
</xsl:for-each>
</xsl:for-each>
</tr>
</table>

На выходе мы получим

Пример:

<table> 
<tr>
<td> One <br />
Two <br />
</td>
<td> Three <br />
</tr>
</table>