2010-03-01 46 views
11

Estoy personalizando un dispositivo Google Search, que usa XSLT para presentar los resultados al usuario. Nuestro diseño requiere que una de varias imágenes se incluya aleatoriamente en la página de resultados. ¿Hay alguna manera de usar aleatoriedad en XSLT? (Pseudoaleatoriedad está bien para esta aplicación.)Elementos aleatorios en XSLT

Llamar a plantillas aleatorias estaría bien, así como simplemente generar un número aleatorio y una ramificación basada en eso.

+3

Desde el Search Appliance sólo parece interesado en XSLT 1.0, decidí ir con el uso de la longitud de la cadena de búsqueda para determinar qué imagen se muestra. Por lo tanto, estoy usando algo como esto para obtener un rango de números 0-3:

+0

+1, bueno y práctico solución de problemas en las circunstancias. Iba a escribir algo similar como respuesta antes de leer esto. – Tomalak

Respuesta

5

Dependiendo de su plataforma XSL permite inyectar código de usuario como C#. No recomiendo esto Mejor, quisiera que tu XSL aceptara un parámetro y lo que sea que genere tu carga útil XML o XSLT y también puede generar el número aleatorio, configurando el parámetro. He hecho esto con exactitud el uso de este enfoque, excepto los datos provienen de Bing, no G.

+0

¿Cómo convenciste a Bing para que te enviara un número aleatorio? ¿O acabas de tomar una cadena de consulta o algo así y procesarla para obtener un número de ella? Por lo que puedo decir, no tengo mucho control sobre la carga XML que genera Search Appliance. –

+0

La aleatoriedad es generada por el llamador API Bing y el número aleatorio pasado como parámetro. Bing te da XML. Usted tiene un XSLT que acepta parámetros. Simplemente unir comprador y vendedor. –

2

Si no es reacio a incluir bibliotecas, hay muchos disponibles, tales como random:random-sequence from EXSLT

+0

No se puede ver el uso de una biblioteca que implementa random() cuando tiene acceso directo a él a través del entorno de tiempo de ejecución. – dacracot

+1

@dacracot - pero el OP no tiene acceso directo a él a través del envt de tiempo de ejecución. – LarsH

4

Si utiliza un XSLT basado en Java motor, esto le permitirá realizar llamadas a cualquier método estático dentro de las bibliotecas de Java, como java.lang.Math.random(). Ésta es la sintaxis ...

<?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: tiene que ser XSL versión 1.1 o superior. – dacracot

+0

¡Buen truco! Desafortunadamente, Search Appliance solo parece interesado en XSLT v1.0. ¡Ratas! –

+1

No disponible para Saxon HE, desafortunadamente. Hubiera sido demasiado bueno para ser verdad. –

1

Si está haciendo esto para cualquier cosa Microsoft, descubrí que usando la función ddwrt de XSLT: Random funciona.

utilizo el siguiente para crear el número aleatorio

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

y el siguiente para presentar

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