I’m looking to get some XSLT (for Umbraco CMS) coded properly and I’m getting kind of stumped. What I’m trying to do is:
Start from a certain node, put each child node into a div; for every 3 children, wrap in a parent div.
Instead of my mess of for-each,choose and when statements, I have tried implementing a apply-template structure but I just can’t seem to get the hang of it; so here’s my mess of XSLT right now (I’m sure this is bad practice & terrible for performance, but I really don’t know what to do at the moment):
<div class="row four">
<h2>Smart Phones <a href="#" class="see-all">see all smart phones →</a></h2>
<div class="row three"> <!-- This div should be created again for every 3 divs -->
<xsl:for-each select="umbraco.library:GetXmlNodeById('1063')/descendant::*[@isDoc and string(showInMainNavigation) = '1']">
<xsl:choose>
<xsl:when test="position() < 3">
<div class="col">
<a href="{umbraco.library:NiceUrl(./@id)}">
<img class="phonePreviewImg" src="{./previewImage}" style="max-width:117px; max-height:179px;" />
<h4 class="phoneTitle"><xsl:value-of select="./@nodeName" />/h4>
<p class="phonePrice">$<xsl:value-of select="./price" /></p
</a>
</div>
</xsl:when>
<xsl:when test="position() = 3"> <!-- set this div to include class of `omega` -->
<div class="col omega">
<a href="{umbraco.library:NiceUrl(./@id)}">
<img class="phonePreviewImg" src="{./previewImage}" style="max-width:117px; max-height:179px;" />
<h4 class="phoneTitle"><xsl:value-of select="./@nodeName" />/h4>
<p class="phonePrice">$<xsl:value-of select="./price" /></p
</a>
</div>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</div> <!-- End Row Three -->
</div> <!-- End Row Four -->
Obviously this code does not produce the “wrap every three”. Can anyone shed some light on what I need to do to accomplish this?
UPDATE – improved the answer
I cannot think of an elegant solution using templates, but this clunky one with a loop works:
applied to:
produces:
You need to replace the
selectused to set the$nodesvariable the XPath selecting the nodes you want, and therendertemplate with the code needed to generate the result you need for each node.