我有一个包含如下节点的 XML 文件:
<values>
<item>item 1</item>
<item>item 2</item>
<item>item 3</item>
<item>item 4</item>
<item>item 5</item>
</values>
我想使用 xslt 以随机顺序获取列表:
<values>
<item>item 3</item>
<item>item 5</item>
<item>item 1</item>
<item>item 4</item>
<item>item 2</item>
</values>
我无法使用外部资源,例如
“xmlns:java =“java.lang.Math”
和
“xmlns:math =”http://exslt.org/math“
因为限制。
也许这个链接可能有帮助:
http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXSL-htm.htm http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXSL-htm.htm
以下样式表将把项目写入输出树以随机顺序。样式表期望在运行时提供外部“初始种子”编号作为参数。
注意:由于项目只是重新排序而不进行处理,因此不需要对它们进行排序,而且这里也不需要 EXSLT node-set() 函数。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:param name="initial-seed" select="123"/>
<xsl:template match="/">
<values>
<xsl:call-template name="pick-random-item">
<xsl:with-param name="items" select="values/item"/>
</xsl:call-template>
</values>
</xsl:template>
<xsl:template name="pick-random-item">
<xsl:param name="items" />
<xsl:param name="seed" select="$initial-seed"/>
<xsl:if test="$items">
<!-- generate a random number using the "linear congruential generator" algorithm -->
<xsl:variable name="a" select="1664525"/>
<xsl:variable name="c" select="1013904223"/>
<xsl:variable name="m" select="4294967296"/>
<xsl:variable name="random" select="($a * $seed + $c) mod $m"/>
<!-- scale random to integer 1..n -->
<xsl:variable name="i" select="floor($random div $m * count($items)) + 1"/>
<!-- write out the corresponding item -->
<xsl:copy-of select="$items[$i]"/>
<!-- recursive call with the remaining items -->
<xsl:call-template name="pick-random-item">
<xsl:with-param name="items" select="$items[position()!=$i]"/>
<xsl:with-param name="seed" select="$random"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
将默认初始种子 (123) 应用于您的输入,输出为:
<?xml version="1.0" encoding="utf-8"?>
<values>
<item>item 2</item>
<item>item 3</item>
<item>item 1</item>
<item>item 4</item>
<item>item 5</item>
</values>
当使用种子 1234 执行时,输出为:
<?xml version="1.0" encoding="utf-8"?>
<values>
<item>item 4</item>
<item>item 1</item>
<item>item 5</item>
<item>item 2</item>
<item>item 3</item>
</values>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)