Случайные предметы в XSLT - PullRequest
11 голосов
/ 02 марта 2010

Я настраиваю Google Search Appliance, которое использует XSLT для представления результатов пользователю. Наш дизайн требует случайного включения одного из нескольких изображений на странице результатов. Есть ли способ использовать случайность в XSLT? (Псевдослучайность просто подходит для этого приложения.)

Было бы неплохо вызывать случайные шаблоны, так как можно было бы просто генерировать случайное число и ветвь на его основе.

Ответы [ 5 ]

7 голосов
/ 02 марта 2010

Вы можете генерировать в чистом виде XSLT последовательности случайных чисел, а также случайные перестановки чисел в [1 .. N].

Просто используйте для этого библиотеку FXSL (написанную на чистом XSLT).

Эта статья объясняет шаблоны для использования и имеет полные примеры:

" Бросок кости с помощью FXSL: функции генерации случайных чисел в XSLT ".

5 голосов
/ 02 марта 2010

В зависимости от вашей платформы XSL позволяет вводить код пользователя, например C #. Я не рекомендую это. Лучше, если бы ваш XSL принимал параметр и все, что генерирует полезную нагрузку XML или XSLT, а также мог генерировать случайное число, устанавливая параметр. Я сделал это точно, используя этот подход, за исключением того, что данные пришли из Bing, а не из G.

4 голосов
/ 02 марта 2010

Если вы используете механизм XSLT на основе Java, это позволит вам выполнять вызовы любого статического метода в библиотеках 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>
2 голосов
/ 02 марта 2010

Если вы не против включения библиотек, есть много доступных, таких как random: random-sequence from EXSLT

1 голос
/ 28 мая 2014

Если вы делаете это для чего-нибудь Microsoft, я обнаружил, что с помощью функции 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>
...