[英]Efficient Random Nodes in XSLT
我需要一些建议,而不是XSLT专家...
我有以下代码,但过程缓慢,导致页面加载时间太长! 我知道必须有另一种方法,但是我无法解决。
基本上,我有一个很大的节点列表,我想随机返回3个节点,而不必每次都在整个列表中不断进行“ for-each”操作?
任何帮助将不胜感激! 谢谢。
<msxml:script implements-prefix="random" language="C#">
<msxml:assembly name="umbraco"/>
<msxml:using namespace="umbraco"/>
<![CDATA[
public int GetRandom(int minValue, int maxValue)
{
return umbraco.library.GetRandom().Next(minValue, maxValue);
}
]]>
</msxml:script>
<xsl:template match="/">
<xsl:variable name="bigCount" select="count(umbraco.library:GetXmlNodeById(1070)/descendant::* [@isDoc and string(umbracoNaviHide) != '1'][(self::AddANewsStory or self::AddAFeature or self::AddABlogEntry)])" />
<xsl:for-each select="umbraco.library:GetXmlNodeById(1070)//descendant::*[@isDoc and string(umbracoNaviHide) != '1'][(self::AddANewsStory or self::AddAFeature or self::AddABlogEntry)]">
<xsl:sort select="random:GetRandom(1, $bigCount)" order="ascending"/>
<xsl:if test="position() <= $repeated">
<div class="relative hover-shadow mb">
<a href="{umbraco.library:NiceUrl(@id)}"><img src="/ImageGen.ashx?image={concat(substring-before(umbracoFile ,'.'),'_Article Image.jpg')}" width="100%" alt="{newsTitle}" /></a>
<div class="r_content">
<xsl:variable name="catID" select="umbraco.library:GetXmlNodeById(selectACategory)/@id"/>
<div class="r_title"><a href="{umbraco.library:NiceUrl(@id)}"><xsl:value-of select="newsTitle"/><xsl:value-of select="blogTitle"/><xsl:value-of select="featureTitle"/></a></div>
</div>
</div>
</xsl:if>
</xsl:for-each>
</xsl:template>
我不确定随机脚本调用是否会导致速度变慢,我认为是xsl:sort调用中的随机数生成器使所有事情搞砸了。
试试下面的脚本:
将变量设置为源。 不要使用.net调用,它们只会减慢速度。
<xsl:variable name="source" select="$currentPage/ancestor-or-self::@[@level = 1]//*[@isDoc][@id = 1070]"/>
收集您的节点。
<xsl:variable name="nodes">
<xsl:apply-templates select="msxml:node-set($source)//*[@isDoc and string(umbracoNaviHide) != '1'][(self::AddANewsStory or self::AddAFeature or self::AddABlogEntry)]" mode=filter"/>
</xsl:template>
</xsl:variable>
从这些节点获取计数。
<xsl:variable name="bigCount" selet="count(msxml:nodeset($nodes)/*)"/>
身份模板,添加一个随机值作为属性。 使用mode属性定位特定模板:过滤器。
<xsl:template match="*" mode="filter">
<xsl:attribute name="randomOrder">
<xsl:value-of select="random:GetRandom(1,$bigCount)"/>
</xsl:attribute>
<xsl:copy-of select="node()|@*"/>
</xsl:template>
渲染节点。 使用mode属性定位特定模板:渲染。 根据新属性randomOrder进行排序。
<xsl:template match="/">
<xsl:apply-templates select="msxml:node-set($nodes)/*" mode="render">
<xsl:sort select="@randomOrder" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:template>
为每个节点呈现的项目模板。
<xsl:template match="*" mode="render">
<div class="relative hover-shadow mb">
<xsl:value-of select="."/>
</div>
</xsl:template>
并添加了具有正确名称空间的完整脚本:xmlns:random =“ urn:my-scripts”
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:random="urn:my-scripts" version="1.0"
exclude-result-prefixes="random msxml umbraco.library">
<msxml:script implements-prefix="random" language="C#">
<msxml:assembly name="umbraco"/>
<msxml:using namespace="umbraco"/>
<![CDATA[
public int GetRandom(int minValue, int maxValue)
{
return umbraco.library.GetRandom().Next(minValue, maxValue);
}
]]>
</msxml:script>
<xsl:param name="currentPage"/>
<xsl:variable name="source" select="$currentPage/ancestor-or-self::*[@level = 1]//*[@isDoc][@id = 1070]"/>
<xsl:variable name="nodes">
<xsl:apply-templates select="msxml:node-set($source)//*[@isDoc and string(umbracoNaviHide) != '1'][(self::AddANewsStory or self::AddAFeature or self::AddABlogEntry)]" mode="filter"/>
</xsl:variable>
<xsl:variable name="bigCount" select="count(msxml:node-set($nodes)/*)"/>
<xsl:template match="*" mode="filter">
<xsl:attribute name="randomOrder">
<xsl:value-of select="random:GetRandom(1,$bigCount)"/>
</xsl:attribute>
<xsl:copy-of select="node()|@*"/>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="msxml:node-set($nodes)/*" mode="render">
<xsl:sort select="@randomOrder" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*" mode="render">
<div class="relative hover-shadow mb">
<xsl:value-of select="."/>
</div>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.