質問
XSLT ドキュメント内で、現在のディレクトリ内の一連のファイルをループすることは可能ですか?
レポートを生成するために分析を行う必要がある XML ファイルでいっぱいのディレクトリがあるという状況があります。スタイルシートは単一のドキュメントで問題なく動作していますが、XML ドキュメントをマージするために別のツールを使用せずにスタイルシートを拡張したいと考えています。
私は次のような線に沿って考えていました。
<xsl:for-each select="{IO Selector Here}">
<xsl:variable select="document(@url)" name="contents" />
<!--More stuff here-->
</xsl:for-each>
解決
XSLT 2.0 および Saxon では、これを次のように実行できます。 collection()
関数:
<xsl:for-each select="file:///path/to/directory">
<!-- process the documents -->
</xsl:for-each>
見る http://www.saxonica.com/documentation/sourcedocs/collections.html 詳細については。
XSLT 1.0 では、別のツールを使用して、処理するドキュメントをリストするインデックスを作成する必要があります。あなたの環境がそのようなツールを提供しているかもしれません。たとえば、Cocoon には ディレクトリジェネレーター このようなインデックスを作成します。しかし、自分の環境がわからないと、何を推奨するかを知るのは困難です。
他のヒント
他の人が言ったように、プラットフォームに依存しない方法でそれを行うことはできません。.NET の世界では、document('dir://c:/foo/') が 'c:\foo' ディレクトリ内のファイルのリストを任意の形式で返すようにカスタム XmlResolver を作成できます。カスタム XmlResolver の詳細については、次のリンクを参照してください。
XmlUrlResolver クラスのカスタマイズ
XmlResolver の威力
また、スクリプトを使用することもできます ( msxsl:スクリプト 要素)、または XSLT スタイルシートの拡張子。
これらすべてのアプローチでは、XSLT コードを他のプラットフォームに移植できなくなります。
XSL がそのように動作するように設定されているとは思えません。これは、1 つまたは複数のドキュメント上で他の何かによって使用されるように設計されており、XSLT を適用する必要があるファイルを見つけるのは他の何かが担当します。
主要な文書が 1 つと、サポート文書の固定セットがある場合は、おそらく document()
関数 特定のノードや値を返すために使用しますが、あなたのケースは異なると思います。
XSLT内からはこれは不可能だと思います。
すべての XML ファイル名をカンマ区切りのリストとして <xsl:param name="files" /> に渡し、再帰と substring-before() および substring-after() を使用してループすることができます。
これに使用できるコマンドライン ツールがあります。これは、Ant (Java ビルド ツール) に組み込まれた XSLT プロセッサを使用して、入力を処理し、出力に変換します。バッチファイル for ループでラップするのは簡単でしょう。
svn://donie.homeip.net/public/tools
.Net を使用している場合は、XsltExtension を使用して XSLT ドキュメントから .net クラスのメソッドを呼び出すことができます。このメソッドはノードセットを XSLT に返すことができます。したがって、メソッドはファイル IO 部分を処理できます。