如何在使用Saxon进行xslt转换期间创建文件夹,然后在其中复制二进制数据

时间:2013-05-09 07:40:51

标签: java xslt xslt-2.0 saxon

我目前正在编写一个XSLT样式表,用于处理DOCX文档到(X)HTML文件的转换。

鉴于图像被包含(在解压缩的DOCX存档的/ word / media文件夹中)或从文件系统引用,我必须将它们从给定的源位置复制到指定的转换的输出文件夹中使用外部配置文件中的参数。

实际上使用无法实现的纯XSLT,但是,Saxon XSLT处理器的PE和EE版本提供了调用反身java扩展函数(参见http://www.saxonica.com/documentation/extensibility/functions/)的可能性,该函数允许执行文件/从XSLT样式表的上下文中的文件系统操作。

到目前为止我所拥有的是:我可以从他们给定的源位置抓取文件并将它们复制到所需的输出文件夹。我在这里采用了Stefan Krause描述的方法:http://www.oxygenxml.com/archives/xsl-list/201011/msg00051.html

但是,这仅在输出文件夹已存在时才有效。如果不是,Java函数会产生错误消息。

所以我现在想要的是在转换开始时创建输出文件夹,不知怎的样:

    <xsl:template match="/">
      <!-- the reflexive java function that creates the output dir gets called -->
      <xsl:value-of select="java:mkdirs($base-path,$dir)" />
    </xsl:template>

这里有java:mkdirs函数(在外部文件中),到目前为止,它不起作用。

    <xsl:stylesheet 
      version    = "2.0"
      xmlns:xs   = "http://www.w3.org/2001/XMLSchema"
      xmlns:xsl  = "http://www.w3.org/1999/XSL/Transform"

      xmlns:java      = "http://www.java.com"
      xmlns:java-uri  = "java.net.URI"
      xmlns:java-file = "java.io.File">

      <!-- reflexive java function to create a folder -->
      <xsl:function name="java:mkdirs">
        <xsl:param    name="base-path" as = "xs:string" />
        <xsl:param    name="dir"       as = "xs:string" />
        <xsl:variable name="full-path" as = "xs:string" select = "concat($base-path,'/',$dir)" />
        <xsl:variable name="new-dir" select="java-file:new(java-uri:new($full-path))" />
        <xsl:sequence select="java-file:mkdirs($new-dir)" /> 
      </xsl:function>
    </xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

我认为您需要的功能都在EXPath文件模块中,可与Saxon 9.5(PE和更高版本)一起使用。你不需要自己编写。见http://www.saxonica.com/documentation/index.html#!functions/expath-file