Случайным образом выберите узел в XSLT

Когда Вы не хотите, чтобы пользователи получили доступ к деструктору, т.е. Вы хотите, чтобы объект только был уничтожен через другие средства.

http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx дает пример, где объект является считаемой ссылкой и должен только быть уничтожен самим объектом, когда количество переходит к нулю.

7
задан Kim Andersen 19 December 2010 в 15:13
поделиться

3 ответа

В Umbraco вы можете сделать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltMath">

<xsl:output method="xml" omit-xml-declaration="yes"/>

<xsl:param name="currentPage"/>

<!-- This should probably be a macro parameter so you can use this elsewhere-->
<xsl:variable name="parentNode" select="1048"/>

<xsl:template match="/">

        <xsl:variable name="numberOfNodes" select="count(umbraco.library:GetXmlNodeById($parentNode)/node)"/>

        <xsl:variable name="randomPosition" select="floor(Exslt.ExsltMath:random() * $numberOfNodes) + 1"/>

        <xsl:variable name="randomNode" select="umbraco.library:GetXmlNodeById($parentNode)/node [position() = $randomPosition]"/>

        <!--
          You now have the node in the $randomNode variable
          If you just want the id then you can do an XPath query on the variable
          or you can modify the XPath above to get the property you are after rather than
          the whole node
        -->

    <xsl:value-of select="$randomNode/@nodeName" />

</xsl:template>
</xsl:stylesheet>

Надеюсь, это поможет.

Тим

7
ответ дан 7 December 2019 в 07:48
поделиться

Получение случайного числа в xslt - непростая задача.

Там ' http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXSL-htm.htm

Возможно, процессор, который вы используете для преобразования xsl, может расширять выражения xsl с помощью внешние функции. В этом случае, возможно, вы можете использовать внешнюю случайную функцию.

0
ответ дан 7 December 2019 в 07:48
поделиться

Все, что вам нужно, это генератор случайных чисел. В XSLT его нет, поэтому случайное число должно быть предоставлено чем-то вне XSLT. Для этого вам нужно будет вызвать метод из внешней библиотеки, и реализация этой библиотеки будет зависеть от того, используете ли вы Windows (.NET или WIN32) или Linux и процессор XSLT. XSLT может выполнять математические вычисления, но ему не хватает многих функций, связанных с датой / временем, которые включают генератор случайных чисел.

Однако XSLT имеет функцию XPath с именем generate-id () , которая будет генерировать уникальный идентификатор. Если бы вы могли каким-то образом преобразовать это в число, его можно было бы использовать для создания случайного числа, хотя это было бы предсказуемо, и некоторые числа могли бы встречаться чаще, чем другие. Я бы не стал его использовать.

Если вы используете MSXSL для обработки вашей таблицы стилей, вы можете включить JavaScript для генерации случайных чисел в таблице стилей. (Или сценарий C # при использовании .NET.)

Получить сам узел легко, если вы знаете количество дочерних узлов. Просто попросите узел в случайном месте. Что-то вроде / node / node [5] вернет 5-й узел.

0
ответ дан 7 December 2019 в 07:48
поделиться