Я думаю, что в XSL нет прямого способа сделать это, но я хотел бы проконсультироваться со всеми вами перед написанием кода на стороне сервера.
Я работаю над сайтом для отображения твитов из сотен разных аккаунтов с помощью Twitter API.
Существует большой XML-файл, содержащий более 200 идентификаторов твиттера и число (1-12). У меня есть PHP-скрипт, который выполняет OAuth и выводит JSON с помощью Twitter API. Этот PHP-файл принимает в качестве строк запроса как id, так и count.
Теперь в твиттере есть ограничение на количество запросов, которые можно отправить за 15 минут. Поскольку веб-страница генерируется с использованием XSL-преобразования через Saxon, я подумал сделать что-то вроде:
<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>
Опять же, я понимаю, что это очень легко сделать, просто используя сценарии на стороне сервера, и мне любопытно, есть ли способ добавить sleep () во время преобразования XSL. Любые идеи / рекомендации будут высоко оценены.
Я могу придумать два способа сделать это: один — периодически выполнять преобразование на сервере (то есть спать между преобразованиями), другой — генерировать HTML-код, содержащий код Javascript (или Saxon-CE), который периодически выбирает канал Twitter. Мы продемонстрировали, как это сделать, в статье на XML Prague 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>
Усиливающая информация: Это работало очень хорошо для меня при работе внутри OxygenXML с выбранным SaxonPE. Тем не менее, у меня есть не заставил его работать при запуске преобразований из командной строки.
Я думаю, что в Oxygen преобразование нашло java.package во внутренней среде выполнения Oxygen. Я не понял, как сделать пакет потоков доступным в командной строке.