Может ли XSLT выполнить сценарий оболочки на уровне операционной системы?

У меня есть производственный процесс, который объединяет XSLT и несколько сценариев оболочки примерно за 4 шага до его завершения. Я выполняю каждый шаг вручную в данный момент.

Я использую Saxon 9 из командной строки в Linux. Могу ли я иметь сценарии оболочки XSL для выполнения... вместо меня?

(Я знаю, что мог бы достичь желаемого результата другим способом с помощью Ant или Make... но предпочел бы остаться в XSLT, если это не требует больших усилий)

Обновление: я свернул свои сценарии оболочки и ускорил работу с помощью Xproc. Я не совсем доволен результатом, но Xproc улучшил жизнь. Предложение Кая, представленное ниже, выглядит хорошо... но я еще не пробовал.

2 ответа

Решение

Вы можете вызвать java.lang.Runtime.exec() так же, как и любую другую внешнюю функцию Java.

Я тоже не разбираюсь в Java, но с помощью уроков Майкла Кея на сайте Saxonica я обнаружил, что это выполнимо.

Вот что я сделал, и что работает хорошо для меня: в корневом элементе таблицы стилей XSLT я назначил пространство имен для функции (в моем случае я использую его для разархивирования, поэтому я назвал префикс unzip, но это, безусловно, может быть что-нибудь):

xmlns:unzip="java:java.lang.Runtime"

Я определяю переменную с путем к файлу для пакетного файла, который будет вызван позже. Тогда я использую

<xsl:result-document href="{$batchFile}" method="text"> ... </result document> 

создать командный файл. (Разархивирование можно, конечно, выполнить только с помощью команды, но я обнаружил, что версия пакетного файла более удобна, поскольку мне нужно было объединить команду unzip с некоторой командой изменения каталога и другими мелочами. И, кроме того, использование пакетного файла открывает мир более сложные задачи, которые можно было бы вызвать из листа XSLT.)

Когда мне нужно выполнить мой командный файл, я вставляю сообщение xsl: вот так:

<xsl:message>Executing <xsl:value-of select="unzip:exec(unzip:getRuntime(),concat('cmd /c /y start ',$batchFile))"/></xsl:message>

Надеюсь, что помогает, с наилучшими пожеланиями, Кай

Другие вопросы по тегам