Hvordan bruke <xsl:sort> for å få et random resultat i xslt utlisting?
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.
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 " ">
]>
<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() <= $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.
26.01.10 09:45:58, 