2

この質問からほとんど続きます: XSLT: CSV (またはフラット ファイル、またはプレーン テキスト) から XML へ

だから、私はここから XSLT を持っています: http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html

そして、CSV ファイルを XML ドキュメントに変換します。コマンド ラインで次のコマンドを使用すると、これが行われます。

java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml

ここで問題は、Java コードでこれを行うにはどうすればよいかということです。

現在、次のようなコードがあります。

TransformerFactory transformerFactory = TransformerFactory.newInstance();
StreamSource xsltSource = new StreamSource(new File("location/of/csv-to-xml.xsl"));
Transformer transformer = transformerFactory.newTransformer(xsltSource);
StringWriter stringWriter = new StringWriter();
transformer.transform(documentSource, new StreamResult(stringWriter));
String transformedDocument = stringWriter.toString().trim();

(Transformerは のインスタンスですnet.sf.saxon.Controller。)

コマンド ラインの秘訣は、"-it:main" を指定して、XSLT 内の名前付きテンプレートを直接指すようにすることです。これは、ソース ファイルに「-s」フラグを付ける必要がないことを意味します。

問題は Java 側で再び発生します。この「-it:main」はどこでどのように指定しますか? そうすることで、その指定を必要としない他の XSLT が壊れてしまうのではないでしょうか? すべての XSLT ファイルのすべてのテンプレートに「main」という名前を付ける必要がありますか? Transformer.transform() のメソッド シグネチャを考えると、ソース ファイル指定する必要があります。

編集: saxon9he.jar 内に s9api が隠されているのを見つけました。

4

1 に答える 1

5

XSLT 1.0 用に設計された JAXP API を使用しています。名前付きテンプレートで変換を開始する機能など、XSLT 2.0 の機能を利用したい場合は、代わりに s9api インターフェースを使用することをお勧めします。これは、この目的に適した設計になっています。

ただし、既存の JAXP コードが多数あり、それを書き直したくない場合は、通常、JAXP オブジェクトを基礎となる Saxon 実装クラスにダウンキャストすることで目的を達成できます。たとえば、JAXP Transformer を net.sf.saxon.Controller としてキャストすると、controller.setInitialTemplate(); にアクセスできるようになります。transform() メソッドの呼び出しに関しては、Source パラメーターとして null を指定するだけです。

ちなみに、2.0 プロセッサを必要とするコードを書いている場合は、TransformerFactory.newInstance() を使用しません。これにより、クラスパスで見つかった古い XSLT プロセッサがすべて提供されます。代わりに new net.sf.saxon.TransformerFactoryImpl() を使用してください。これは (a) より堅牢で、(b) はるかに高速です。

于 2012-05-18T20:48:22.977 に答える