繁体   English   中英

XSLT中的有效随机节点

[英]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() &lt;= $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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM