特定のフォルダー (OP の最初のオプション) 内のすべての XML ファイルに対して、.bat スクリプトを使用して XSLT を実行する場合は、次の 3 つの方法が考えられます。
A.基本的には、コマンド ライン経由で個々のファイルを処理するために「for」ループを実行します。(えー)
B.を使用collection()
して入力フォルダーを指定し、 を使用xsl:result-document
して新しいフォルダーに出力ファイルを作成します。
XSLT 2.0 の例を次に示します(Saxon 9 でテスト済み)。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pInputDir" select="'input'"/>
<xsl:param name="pOutputDir" select="'output'"/>
<xsl:variable name="vCollection" select="collection(concat($pInputDir,'/?*.xml'))"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="$vCollection">
<xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
<xsl:result-document href="{concat($pOutputDir,'/',$vOutFile)}">
<xsl:apply-templates/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
ノート:
このスタイルシートは恒等変換を行っているだけです。XMLを変更せずに渡します。チェック/変更を行うには、新しいテンプレートを追加して ID テンプレートをオーバーライドする必要があります。
また、入力フォルダー名と出力フォルダー名には 2 つのパラメーターがあることに注意してください。
collection()
を使用すると、フォルダー内のすべての XML ファイルがメモリに読み込まれるため、メモリの問題が発生する場合があります。これが問題である場合は、以下を参照してください...
C.ディレクトリ内のすべてのファイルのリストを XSLT で処理する。document()
と Saxon 拡張関数を組み合わせて使用してsaxon:discard-document()
、ドキュメントをロードおよび破棄します。
これは、テストのためにしばらく前に使用した例です。
XML ファイルのリスト (XSLT への入力):
<files>
<file>file:///C:/input_xml/file1.xml</file>
<file>file:///C:/input_xml/file2.xml</file>
<file>file:///C:/input_xml/file3.xml</file>
<file>file:///C:/input_xml/file4.xml</file>
<file>file:///C:/input_xml/file5.xml</file>
<file>file:///C:/input_xml/file6.xml</file>
<file>file:///C:/input_xml/file7.xml</file>
<file>file:///C:/input_xml/file8.xml</file>
<file>file:///C:/input_xml/file9.xml</file>
<file>file:///C:/input_xml/file10.xml</file>
</files>
XSLT 2.0 (Saxon 9 でテスト済み):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pOutputDir" select="'output'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="files">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="file">
<xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
<xsl:result-document href="{concat($pOutputDir,$vOutFile)}">
<xsl:apply-templates select="document(.)/saxon:discard-document(.)" xmlns:saxon="http://saxon.sf.net/"/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
ノート:
繰り返しますが、このスタイルシートは恒等変換を行っているだけです。XMLを変更せずに渡します。チェック/変更を行うには、新しいテンプレートを追加して ID テンプレートをオーバーライドする必要があります。
また、出力フォルダー名のパラメーターしかないことにも注意してください。