我认为在XSL中没有直接的方法可以做到这一点,但在编写服务器端代码之前,我想和大家核实一下。
我正在一个网站上工作,使用推特API显示来自数百个不同账户的推文。有一个包含200多个twitter ID和count(1-12)的大型XML文件。我有一个PHP脚本,它使用twitter API进行OAuth并输出JSON。这个PHP文件将id和count都作为查询字符串。现在,推特确实对每15分钟可以发送的请求数量有限制。由于网页是通过Saxon使用XSL转换生成的,所以我想做一些类似于-的事情
<xsl:template name="all-social">
<xsl:for-each select="/social/twitter">
<xsl:value-of select="unparsed-text(concat('http://something/twitter.php?
id=',@id,'&count=',@count))"/>
<!-- or apply-templates select="document(--URL--)" -->
</xsl:for-each>
</xsl:template>
这将返回tweets的JSON,我可以在前端做任何事情来正确显示它。但为了克服API的限制,我需要在for-each
循环中添加一个暂停或睡眠,如-
<xsl:template name="all-social">
<xsl:for-each select="/social/twitter">
<!-- Wait for 5 seconds -->
<xsl:value-of select="unparsed-text(concat('http://something/twitter.php?
id=',@id,'&count=',@count))"/>
</xsl:for-each>
</xsl:template>
同样,我知道只使用服务器端脚本很容易做到这一点,因为我很好奇是否有办法在XSL转换期间添加sleep()。如有任何想法/建议,我们将不胜感激。
我可以想出两种方法来做到这一点:一种是在服务器上定期执行转换(即在转换之间休眠),另一种是生成包含Javascript(或Saxon CE)代码的HTML代码,该代码定期获取twitter提要。我们在XMLPrague 2013上的一篇论文中演示了如何实现后者。
据我所知,XSLT没有本机睡眠功能,但您可以使用扩展函数。例如,如果您使用java进行处理,您可以使用Xalan-J调用Thread.sleep.
供参考:位于https://www.ibm.com/developerworks/community/forums,也许同时还有更好的扩展库,就像2008年的建议一样。
回复延迟。这适用于桌面上的SaxonPE。我不知道它是否会转化为你的环境。4秒暂停:
<xsl:template name="sleep" xmlns:thread="java.lang.Thread">
<xsl:value-of select="thread:sleep(4000)"/>
</xsl:template>
放大信息:在选择了SaxonPE的情况下运行OxygenXML时,它对我来说效果很好。然而,当从命令行运行转换时,我没有让它工作。
我认为在Oxygen中,转换在内部Oxygen运行时中找到了java.package。我还没有弄清楚如何在命令行中使用线程包。