我想将一些随机数连接到日期。 通常它看起来像:
http://xsltransform.net/bdxtrc/1
结果应该是例如2015-09-08T13:53:41.514Z54321 其中54321是随机数。
我尝试使用EXSLT - RANDOM:RANDOM-SEQUENCE函数,但它无法正常工作。我不知道为什么。谁能帮助我? 谢谢, 此致
答案 0 :(得分:1)
好的,我在本地使用oXygen进行了尝试,它带有内置版本的Saxon-EE。看起来该站点禁用了扩展功能,可能是出于安全原因(有些可能很危险)。这就是你收到的原因:
XTDE1425: Cannot find a matching 2-argument function named
{http://exslt.org/random}random-sequence(). There is no Saxon extension function with the
local name random-sequence
此错误也可以来自使用免费版本的Saxon ,最近我问Michael Kay有关它的问题,he answered (full quote):
一般政策是Saxon-HE支持已发布建议的基本一致性级别:对于Saxon 9.6,这意味着XPath 3.0和XQuery 3.0但不是XSLT 3.0,而不是XPath 3.1,而不是高阶函数等可选功能
扩展,包括Saxon扩展以及EXSLT和EXPath扩展,通常需要Saxon-PE或更高版本。
在后续行动中,他解释了你自己can use integrated extension functions创造的方式。对于在线版本(EE不起作用)以及可能对于本地版本,情况都是如此,除非您使用PE或更高版本。如果你也在本地得到这个错误,升级Saxon,或者使用另一种方法(见下)。
以下作品将返回随机序列中的第一项
random:random-sequence(10, 5987)[1]
由于您每次匹配correlationId
时可能需要不同的号码,因此您可以按如下方式更改此号码:
<xsl:variable name="pos" select="position()" />
<xsl:value-of
select="concat(current-dateTime(), random:random-sequence(100, 5987)[$pos])" />
注意,您不需要在concat
的XSLT 2.0中使用xsl:value-of
,同样可以写成:
<xsl:value-of
select="current-dateTime(), random:random-sequence(100, 5987)[$pos]"
separator="" />
请注意,您使用的是原始代码:
<xsl:value-of select="concat(current-dateTime(),random:random-sequence)" />
这是nodetest(即将返回节点random:random-sequence
中的值)。如果调用函数,则必须使用括号,否则将不会调用该函数。在这种情况下,函数需要两个参数,您需要传递它们,并返回一系列数字。
我在此处创建了一个新的代码段:http://xsltransform.net/3NzcBue(请不要更新它,以便它可以保留此答案,如果需要,可以创建一个新的代码段。)
编辑:来自评论。
如果要求具有唯一的字符串,该字符串只需要根据当前节点而变化,并且不必全局唯一或任何东西,那么XSLT的方法是使用generate-id()
函数,它在样式表的一次执行中返回一个保证唯一的字符串。如果将其添加到当前日期时间,则将具有本地唯一字符串。
XSLT 2.0,没有扩展功能:
<xsl:value-of select="concat(current-dateTime(), generate-id(.))" />
答案 1 :(得分:1)
我尝试使用EXSLT - RANDOM:RANDOM-SEQUENCE函数,但事实并非如此 工作正常。我不知道为什么。
最可能的原因是您的处理器不支持此功能。为了确定,我们必须知道究竟什么“无法正常工作”和/或您正在使用哪种XSLT处理器(尽管在这里和您的{{3}中被多次询问,但您拒绝告诉我们})。
但是,我不知道任何支持EXSLT random:random-sequence()
功能的XSLT 1.0处理器。 OTOH,previous question由libxslt,Xalan和Saxon 6支持(仅举几例)。
如果您的神秘处理器不支持,请参阅此处的备选方案:EXSLT math:random()
function