html - 使用XSL从XML随机获取节点

  显示原文与译文双语对照的内容
0 0

我正在制作一个使用CMS的网站,在主页我需要得到一些图片和discriptions随机,我需要每次刷新页面获取新的节点。

这就是我在XSL中调用节点的方式:


<xsl:for-each select ="TSPRoot/Blocks/Block[@ID=134]/Articles/Article[position() &lt; 4]">
 <div class="layout-08">
 <a class="title" href="detailed.aspx?id={ID}">
 <xsl:choose> 
 <xsl:when test ="string-length(ImageURL)> 0">
 <img src="_handlers/resizeimage.ashx?src={ImageURL}&amp;height=149&amp;width=206" title="{Headline}"/>
 </xsl:when>
 <xsl:otherwise>
 <img src="_frontend/ux/images/en_logo.png" width="206" height="149" title="{Headline}"/>
 </xsl:otherwise>
 </xsl:choose>
 </a>
 <div class="bg">
 <a href="detailed.aspx?id={ID}"><xsl:value-of select ="Headline"/></a>
 </div>
 </div>
 </xsl:for-each>

这将获取最新的( 3 ) 节点,每次刷新时我都需要随机( 3 ) 节点。

时间: 原作者:

0 0

我只给你一些可能的解决方案。 从技术上说,XSLT不提供随机数字的方法。 但是,这个问题至少可以用三种不同的方式解决:

  1. 在执行XSLT模板之前在 Java/C#/PHP 代码中生成伪随机数,并将生成的数字作为XSLT参数传递。
  2. 使用扩展函数:http://exslt.org/random/functions/random-sequence/index.html

  3. 使用 current-dateTime() ( XSLT 2.0 ) 函数作为随机数过程的种子。 你可以用几个字符串和数学运算把它转化为拟随机数。 我认为为了你的需要这个解决方案足够了。

EDIT - 广告 3 。

我已经用这个想法做了一些实验。 我已经创建了一些样本代码。 我知道这段代码生成一个真正随机数序列,但简单的web页面的问题可能不够。

以下 XSLT:


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:rnd="http://whatever.org/random">
 <xsl:output indent="yes"/>
 <xsl:function name="rnd:pseudoRandomInternal">
 <xsl:param name="numSeed" as="xs:decimal"/>
 <xsl:variable name="squareSeed" select="xs:string($numSeed*$numSeed)"/>
 <xsl:variable name="oneDivSeed" select="substring($squareSeed, 3, string-length($squareSeed) - 3)"/>
 <xsl:variable name="cc" select="if (string-length($oneDivSeed)> 6) then 
 substring($oneDivSeed, string-length($oneDivSeed) - 6) else 
 $oneDivSeed"/>
 <xsl:value-of select="xs:decimal($cc)"/>
 </xsl:function>
 <xsl:function name="rnd:pseudoRandom" as="xs:decimal*">
 <xsl:param name="range" as="xs:integer"/>

 <xsl:choose>
 <xsl:when test="$range = 1">
 <xsl:variable name="seed" select="substring(xs:string(current-time()), 1, 12)" as="xs:string"/>
 <xsl:variable name="numSeed" select="xs:decimal(translate($seed, ':.+-', ''))"/>
 <xsl:sequence select="(rnd:pseudoRandomInternal($numSeed))"/>
 </xsl:when>
 <xsl:otherwise>
 <xsl:variable name="subSequence" select="rnd:pseudoRandom($range - 1)"/>
 <xsl:variable name="newValue" select="rnd:pseudoRandomInternal($subSequence[1])" as="xs:decimal*"/>
 <xsl:sequence select="($newValue, $subSequence)"/>
 </xsl:otherwise>
 </xsl:choose>
 </xsl:function>
 <xsl:template match="/">
 <xsl:variable name="rr" select="rnd:pseudoRandom(10)" as="xs:decimal*"/>

 <output>
 <xsl:for-each select="$rr">
 <item>
 <xsl:value-of select=". * 3 mod 11"/>
 </item>
 </xsl:for-each>
 </output>
 </xsl:template>
</xsl:stylesheet>

生成了以下输出:


<output>
 <item>10</item>
 <item>9</item>
 <item>6</item>
 <item>9</item>
 <item>9</item>
 <item>10</item>
 <item>3</item>
 <item>5</item>
 <item>9</item>
 <item>4</item>
</output>

原作者:
...