вторник, 4 ноября 2008 г.

XSLT обход набора элементов

Для обхода элементов коллекции можно использовать <xsl:for-each>, но лично я предпочитаю использовать шаблоны. Т.е. связку
<xsl:apply-templates> и <xsl:template match="">.

Допустим, есть некий магазин @store с определенным набором товаров
@items = @store.items

Фрагмент кода store.rxml:


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


Это сгенерирует следующий XML:


<items>
<item id="13">
<item-name><a href="/customstore/item/13">Lucky Number</a></item-name>
<item-description>Navy lucky number 13</item-description>
<item-price>$12.00</item-price>
</item>
<item id="16">
<item-name><a href="/customstore/item/16">Leather ...</a></item-name>
<item-description>Leather is a material created through the tanning of hides and skins of animals</item-description>
<item-price>$17.00</item-price>
</item>
<item id="75">
<item-name><a href="/customstore/item/75">Adobe Photoshop ...</a></item-name>
<item-description>Lorem ipsum dolor sit amet, conse...</item-description>
<item-price>$23.00</item-price>
</item>
</items>


Применим следующие правила XSL-трансформации:


<xsl:apply-templates select="//items" />

<xsl:template match="items">
<xsl:apply-templates select="item" />
</xsl:template>

<xsl:template match="item">
<div class="item" id="item{@id}">
<h2><xsl:copy-of select="item-name/*" /></h2>
<p><xsl:value-of select="item-description" /></p>
<span class="price"><xsl:value-of select="item-price" /></span>
</div>
</xsl:template>


P.S. Для отображения copy-of item-name ссылкой, используем вывод без родительского тега.

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

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

Жги!