2

我有一个生产流程,它在完成之前将 XSLT 和一些 shell 脚本在大约 4 个步骤中组合在一起。我现在手动执行每个步骤。

我在 Linux 的命令行中使用 Saxon 9。我可以让 xsl 执行 shell 脚本……而不是我吗?

(我知道我可以使用 Ant 或 Make 以另一种方式实现预期的结果。但如果这样做不是很大的努力,我更愿意留在 XSLT)

更新:我已经最小化了我的 shell 脚本并使用 Xproc 加快了速度。我对结果并不完全满意,但 Xproc 改善了生活。下面凯的建议看起来不错..但我还没有尝试过。

4

2 回答 2

5

我也不精通 Java,但我在Saxonica 网站上的 Michael Kay 教程中发现它是可行的。

这是我所做的以及对我来说效果很好的方法:在 XSLT 样式表的根元素中,我为函数分配了一个名称空间(在我的情况下,我使用它来解压缩,所以我将前缀命名为 unzip,但这肯定是任何事物):

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

我正在为稍后调用的批处理文件定义一个带有文件路径的变量。然后我正在使用

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

创建批处理文件。(解压缩当然可以只用一个命令完成,但我发现批处理文件版本更方便,因为我需要将解压缩命令与一些更改目录命令和其他小东西结合起来。此外,使用批处理文件打开了一个世界可以从 XSLT 工作表调用的更复杂的任务。)

当我需要执行批处理文件时,我插入一个 xsl:message,如下所示:

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

希望有帮助,最好的问候,凯

于 2013-04-04T07:17:16.437 回答
2

您可以像调用任何其他外部 Java 函数一样调用 java.lang.Runtime.exec()。

于 2013-03-19T16:34:01.920 回答