我目前正在编写一个 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>