2010-03-01 63 views
11

我正在自定义一个Google搜索设备,该设备使用XSLT向用户呈现结果。我们的设计要求将几个图像之一随机包含在结果页面上。有没有在XSLT中使用随机性的方法? (伪随机性对于这个应用程序来说是很好的。)XSLT中的随机项目

调用随机模板会很好,就像刚才能够生成一个随机数和基于此的分支一样。

+3

由于Search Appliance似乎只热衷于XSLT 1.0以下,我决定去与使用长度的搜索字符串来确定显示哪个图像。因此,我正在使用类似这样的方式来获得0-3的数字范围: 2010-03-01 22:17:03

+0

+1,好和实用在这种情况下进行变通。在我读这本书之前,我会写一些类似的答案。 – Tomalak 2010-03-02 13:26:57

回答

5

根据您的平台,XSL允许注入像C#这样的用户代码。我不推荐这个。更好的是,我会让你的XSL接受一个参数,并且生成你的XML负载或XSLT,并且还可以生成随机数,设置参数。我正是使用这种方法只是将数据从兵,不是G.

+0

你是如何说服Bing向你发送一个随机数的?或者你只是拿一个查询字符串或其他东西,并处理它来获得一个数字?据我所知,我无法控制Search Appliance生成的XML有效负载。 – 2010-03-01 21:47:54

+0

随机性是由API API调用者和随机数作为参数传递生成的。 Bing为您提供XML。你有一个接受参数的XSLT。仅仅把买卖双方放在一起。 – 2010-03-01 23:42:35

2

来到如果你不反对包括图书馆这样做,有许多可用的,如random:random-sequence from EXSLT

+0

当您通过运行时环境直接访问它时,无法使用实现random()的库进行查看。 – dacracot 2010-03-01 22:03:57

+1

@dacracot - 但是OP没有通过运行时envt直接访问它。 – LarsH 2011-11-14 21:25:02

4

如果您使用一个基于Java的XSLT引擎,这将允许您调用Java库中的任何静态方法,例如java.lang.Math.random()。下面是语法...

<?xml version='1.0'?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:math="java.lang.Math" 
    version='1.1'> 

    <xsl:template match="/"> 
     <xsl:variable name="myRandom" select="math:random()"/> 
     <xsl:value-of select="$myRandom"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

PS - 它必须是XSL 1.1或更高版本。 – dacracot 2010-03-01 21:59:34

+0

酷招!不幸的是,Search Appliance只对XSLT v1.0感兴趣。老鼠! – 2010-03-01 22:14:23

+1

不幸的是,在Saxon HE下不可用。本来是太好了,不可能是真的。 – 2013-06-11 07:44:04

1

如果你对微软做的任何事情,我发现使用XSLT的函数ddwrt:Random可行。

我使用以下方法来创建随机数

<xsl:variable name="RowCount" select="count($Rows)" /> 
<xsl:variable name="RandomNumber" select="ddwrt:Random(1, $RowCount)" /> 

,并提出

<xsl:for-each select="$Rows[position() = $RandomNumber]"> 
<xsl:value-of select="@Title" /></xsl:for-each>