Hvordan bruke <xsl:sort> for å få et random resultat i xslt utlisting?

by Andtho Email

Jeg satt nylig og skulle løse et problem for en kunde på jobben, de ønsket å ha et felt på siden sin som rulerte partner logoer og som skulle kjøre ut disse random for hver gang siden lastet.

Vi bruker Umbraco CMS for denne kunden og etter litt googling fant jeg denne løsningen som fungerte utmerket.

Utgangspunktet

Jeg opprettet en mediafolder som het partnere, denne har ID 1267, og opprettet en custom mediatype med tre forskjellige properties, Logo, Name og Link.

XSLT filen ble da seende slik ut:

Follow up:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#x00A0;">
]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:randomTools="http://www.umbraco.org/randomTools"
exclude-result-prefixes="msxml umbraco.library msxsl randomTools">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:param name="currentPage"/>
<xsl:variable name="maxItems" select="number(5)" />
<xsl:template match="/">
<ul>
<xsl:for-each select="umbraco.library:GetMedia(1267, 'false')/node">
<xsl:sort select="randomTools:GetRandom(0,count($currentPage//node))" order="ascending" />
<xsl:if test="position() &lt;= $maxItems">
<li>
<a href="{data [@alias = 'PartnerLink']}" target="blank">
<img src="{data [@alias = 'PartnerLogo']}" alt="{data [@alias = 'PartnerName']} logo" />
</a>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</xsl:template>
<msxsl:script language="c#" implements-prefix="randomTools">
<msxsl:assembly href="../bin/umbraco.dll"/>
<![CDATA[
/// <summary>
/// Gets a random integer that falls between the specified limits
/// </summary>
/// <param name="lowerLimit">An integer that defines the lower-boundary of the range</param>
/// <param name="upperLimit">An integer that defines the upper-boundary of the range</param>
/// <returns>A random integer within the specified range</returns>
public static int GetRandom(int lowerLimit,int upperLimit) {
Random r = umbraco.library.GetRandom();
int returnedNumber = 0;
lock (r)
{
returnedNumber = r.Next(lowerLimit, upperLimit);
}
return returnedNumber;
}
]]>
</msxsl:script>
</xsl:stylesheet>

Denne gjør jobben utmerket, håper dette var til hjelp for deg, kom gjerne med kommentar om koden ikke fungerer eller du har spørsmål.

No feedback yet

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)