現在、DOCX ドキュメントから (X)HTML ファイルへの変換を処理する XSLT スタイルシートを作成中です。
画像が (解凍された 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>