我认为在XSL中没有直接的方法可以做到这一点,但是在编写服务器端代码之前想与大家核对。
我正在网站上使用Twitter API显示来自数百个不同帐户的推文。 有一个大型XML文件,包含200多个推特ID和计数(1-12)。我有一个PHP脚本执行OAuth并使用twitter API输出JSON。此PHP文件将id和count作为查询字符串。 现在,twitter确实对每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>
这将返回推文的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()。任何想法/建议都将受到高度赞赏。
答案 0 :(得分:1)
据我所知,XSLT没有本机睡眠功能,但您可以使用扩展功能。例如。如果您使用java进行处理,可以使用Xalan-J来调用Thread.sleep。
供参考:在https://www.ibm.com/developerworks/community/forums找到,也许同时有更好的扩展库,因为这个推荐是从2008年开始的。
答案 1 :(得分:1)
我可以想到两种方法:一种是在服务器上定期执行转换(即在转换之间休眠),另一种是生成包含Javascript(或Saxon-CE)代码的HTML代码,该代码定期提取推特饲料。我们在XML Prague 2013的一篇论文中演示了如何做后者。
答案 2 :(得分:1)
迟到的回复。这适用于桌面上的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。我还没弄明白如何在命令行中提供线程包。