Java 如何在xslt转换期间使用Saxon创建文件夹,以便在转换后复制二进制数据

Java 如何在xslt转换期间使用Saxon创建文件夹,以便在转换后复制二进制数据,java,xslt,xslt-2.0,saxon,Java,Xslt,Xslt 2.0,Saxon,我目前正在编写一个XSLT样式表,它将处理从DOCX文档到(X)HTML文件的转换 鉴于图像包含在(解压DOCX存档的/word/media文件夹中)或从文件系统引用,我必须将它们从给定的源位置复制到转换的输出文件夹,该文件夹由外部配置文件中的参数指定 实际上使用纯XSLT是不可能的,但是,Saxon XSLT处理器的PE和EE版本提供了调用自反java扩展函数的可能性(请参阅),它允许在XSLT样式表的上下文中执行文件/文件系统操作 到目前为止,我所拥有的是:我可以从给定的源位置对文件进行绘图

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

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

实际上使用纯XSLT是不可能的,但是,Saxon XSLT处理器的PE和EE版本提供了调用自反java扩展函数的可能性(请参阅),它允许在XSLT样式表的上下文中执行文件/文件系统操作

到目前为止,我所拥有的是:我可以从给定的源位置对文件进行绘图,并将其复制到所需的输出文件夹。我在这里采用了Stefan Krause描述的方法:

但是,这仅在输出文件夹已存在时有效。如果没有,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>


我认为您需要的功能都在EXPath文件模块中,Saxon 9.5(PE和更高版本)提供了这些功能。你不需要自己写。请参见

谢谢您的回答。我计划在下一次氧气编辑器更新包括新的Saxon PE/EE 9.5版本时,通过EXPath函数提供这些功能。然而,我也有/想要使样式表向后兼容较旧的Saxon PE/EE版本,据我所知,除了使用自反Java函数之外,没有其他方法。