XSL中的睡眠功能



我认为在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,'&amp;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,'&amp;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。我还没有弄清楚如何在命令行中使用线程包。

最新更新