【问题标题】:Try to concatenate date + random number尝试连接日期+随机数
【发布时间】:2015-09-08 13:56:57
【问题描述】:

我想将一些随机数连接到日期中。 一般是这样的:

http://xsltransform.net/bdxtrc/1

结果应该是例如 2015-09-08T13:53:41.514Z54321 其中 54321 是一个随机数。

我尝试使用 EXSLT - RANDOM:RANDOM-SEQUENCE 函数,但它无法正常工作。我不知道为什么。有人可以帮我吗? 谢谢, 问候

【问题讨论】:

  • 你好 ;)。您没有调用该函数,但您正在使用名称测试。但是我改成random:random-sequence(10, 12.0)[1]之后还是报错,说函数不存在。你看过这个吗? stackoverflow.com/questions/2359134/random-items-in-xslt
  • 天啊,生成简单的随机数真的那么难吗:D不好
  • 随机数从来都不是简单的,它实际上在任何语言中都很难,但在函数式语言中尤其困难(请参阅为什么会这样:programmers.stackexchange.com/questions/202908/…) .在 XPath 3.1 中,修正了一个标准函数的遗漏。但是上面的代码有什么难的?该函数返回一组数字。你需要说你需要哪一个。任何随机数生成器都需要一个种子(第二个参数)和一个数量(第一个参数)。与那里的其他语言没有什么不同。
  • XSLT 和 XPath,还有 F#、Haskell、Erlang,都是纯函数式语言。这意味着:对同一函数的两次相同函数调用将导致相同的结果。因此,随机数的问题。您需要一种方法来更改参数(在下面的示例中,我通过使用当前位置来做到这一点)。对于任何函数式语言都是如此,这也是它们如此稳定且从未(几乎从未)拥有NullPointerExceptions 的核心原因,并且您编写的代码“正常工作”并且可以轻松实现多线程。但是,当然,任何语言都有一个学习曲线;)。
  • @maciek2791 "生成简单的随机数真的有那么难" 这比让你回答这个问题更容易:你使用的是哪个 XSLT 处理器?

标签: xml xslt


【解决方案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])" />

注意,XSLT 2.0 中的concat 不需要与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 中的值)。如果调用函数,必须使用括号,否则函数将不会被调用。在这种情况下,该函数需要两个参数,您需要传递它们并返回一个数字序列。

我在这里创建了一个新的代码 sn-p:http://xsltransform.net/3NzcBue(请不要更新它,以便它可以保留此答案,如果需要,请创建一个新的 sn-p)。


编辑:来自 cmets。

如果要求有一个唯一的字符串,它只需要根据当前节点而变化,而不必是全局唯一的或任何东西,XSLT 的方法是使用generate-id() 函数,它返回在样式表的一次执行中保证唯一的字符串。如果将其添加到当前日期时间,您将拥有一个本地唯一的字符串。

XSLT 2.0,没有扩展功能:

<xsl:value-of select="concat(current-dateTime(), generate-id(.))" />

【讨论】:

  • 阿贝尔,你是最棒的! : ) 我输入了那个代码,结果就是:xsltransform.net/bdxtrc/2。我做错了吗?
  • @maciek2791 我想你错过了我的开场白,请检查一下,它解释了为什么它不起作用。您是否已经下载了 Saxon?
  • 你能解释一下究竟是哪个“para”吗?目前我正在使用我选择撒克逊引擎的 xlstransform 网站。编辑。好的,我明白了:)
  • 不幸的是,我在本地运行它。仍然不起作用:(。结果是
  • 你好。我补充说: select="concat(current-dateTime(), generate-id())" ,生成一些唯一的字符串对我来说就足够了:) Abel 再次 - 谢谢你的帮助。问候
【解决方案2】:

我尝试使用 EXSLT - RANDOM:RANDOM-SEQUENCE 函数,但它没有 正常工作。我不知道为什么。

最可能的原因是您的处理器不支持此功能。可以肯定地说,我们必须知道究竟是什么“不能正常工作”和/或您正在使用哪个 XSLT 处理器(尽管在这里和您的 previous question 被多次询问,但您拒绝告诉我们) .

不过,我不知道有任何 XSLT 1.0 处理器支持 EXSLT random:random-sequence() 函数。 OTOH,EXSLT math:random() function 受到 libxslt、Xalan 和 Saxon 6(仅举几例)的支持。

如果您的神秘处理器不支持它,请在此处查看替代方案:generate random number in RSS viewer webpart

另请参阅:How to generate random UUID using xslt

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-08-20
  • 2017-09-09
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多