понедельник, 17 ноября 2008 г.

XSLT вывод элементов в группах

Довольно давно сталкивался с задачкой как в XSLT сделать вывод элементов коллекции в группах по X элементов. Решил поделиться решением :).

Например, есть магазин (@store) и в нём товары (@items). Нужно с помощью XSLT выводить их в 2, 3 или 4 колонки.
@store = Store.find(params[:id])
@items = @store.items

Вот так я генерирую XML

Фрагмент файла index.rxml


# Store items
xml.tag!("item-list") do
@items.each do |item|
xml.tag!("item", :id => item.id) do
xml.tag! "name" do
xml << (link_to truncate(item.name, 20), :controller => "store", :action => "item", :id => item.id)
end
xml.tag! "description", truncate(item.description, 36)
xml.tag! "price", item.price
end
end
end


В файле XSLT задаю параметр, в котором будет задаваться размер группы <xsl:param name="group-size" select="'3'" />, чтобы легче в-последствии было его изменять.

А примерно вот так выглядит файл XSLT трансформации.

Фрагмент файла index.xsl


<xsl:param name="group-size" select="'3'" />

...

<xsl:apply-templates select="//item-list" />

<xsl:template match="item-list">
<table class="item-gallery">
<xsl:apply-templates select="item[position() mod $group-size = 1]" mode="row" />
</table>
</xsl:template>

<!-- Строка -->
<xsl:template match="item" mode="row">
<tr>
<xsl:apply-templates select=". | following-sibling::item[position() &lt; $group-size]" />
</tr>
</xsl:template>

<!-- Ячейка -->
<xsl:template match="item">
<td>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td align="left" colspan="2"><strong><xsl:copy-of select="item-name/*" /></strong></td></tr>
<tr><td align="left" colspan="2"><xsl:value-of select="item-description" /></td></tr>
<tr><td align="left"><strong>price:</strong></td><td align="right"><xsl:value-of select="item-price" /></td></tr>
</table>
</td>
</xsl:template>

Вуа-ля! Элементы выводятся в строки по 3.

1 Комментариев :

Анонимный комментирует...

Спасибо огромное! Очень выручил ваш пост!

Отправить комментарий

Жги!