This week I re-discovered a technique for displaying a random item from a list using XSL. This can apply to both Content Query Web Parts (CQWP) and XSLT List View Web Parts (XLV) and is actually a very trivial piece of XSL.
The technique goes something like:
- Get a count of how many items to choose a random item from, say RowCount
- Return a random number between 1 and RowCount
- Use that random number to display a list item
The important bit is discovering/ remembering that there is a function available to use in SharePoint in the ddwrt namespace that generates a random number between two given numbers. It is this ddwrt:Random(1, RowCount) function that allows us to achieve our objective.
The XSL could look something like this:
<xsl:stylesheet version="1.0" exclude-result-prefixes="x d xsl ddwrt" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"> <xsl:template match="/"> <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row" /> <xsl:variable name="RowCount" select="count($Rows)" /> <xsl:variable name="RandomNumber" select="ddwrt:Random(1, $RowCount)" /> <xsl:for-each select="$Rows[position() = $RandomNumber]"> <xsl:value-of select="@Title" /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Note, even though we’re only displaying a single item we are still querying and returning potentially many items. For this reason I’d only recommend using this technique on relatively small lists.