この質問からの私の思考パターンの続きとして: Saxon in Java: XSLT for CSV to XML
その質問に対する Michael Kay の回答によると、最終的にはドキュメントに XSLT を適用するための次のコードになりました。
Processor processor = new Processor(false);
StringWriter stringWriter = new StringWriter();
Serializer serializer = new Serializer(stringWriter);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(transformLocation)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("main"));
transformer.setParameter(new QName("filePath"), new XdmAtomicValue("location/of/Test.csv"));
transformer.setDestination(serializer);
transformer.transform();
String transformedDocument = stringWriter.toString().trim();
このコードは、Saxon で s9api を使用しています (私はバージョン 9.4 HE を使用しています)。これにより、初期テンプレートを設定し、変換するドキュメントへのパスを動的に挿入できます。これにより、非 XML ファイル (この特定のケースでは CSV など) を変換できます。
ただし、これにより、コードの再利用性がいくらか失われます。
説明させてください:私にはtransformDocument()方法があります。もともと、CSV の変換などのクレイジーなことをしようとしていて、XML のみで作業する前は、自分のメソッドmarshalObjectToDocument()とunmarshalDocumentToObject()メソッドの両方から呼び出されていました (再利用性があります)。
以下は、XML のみの世界での 2 つの方向の比較です。
unmarshalDocumentToObject()- ドキュメントを含むファイルから始めます。
- 私はこれをします:
new StreamSource(new File(documentLocation)) - これは、「ソース」( ) として
StreamSourceに渡すことができます。transformDocumentXsltTransformer.setSource()
marshalObjectToDocument()- ある種のオブジェクトから始めます。
- これは、XML の巨大な文字列にマーシャリングされます。
- 私はこれをします:
new StreamSource(new StringReader(giantStringOfXML)) - これは、「ソース」( ) として
StreamSourceに渡すことができます。transformDocumentXsltTransformer.setSource()
ケース 1 ( unmarshalDocumentToObject()) の場合、ファイル パスが入ってくるのでtransformDocument()、ファイル パス文字列を取得して渡すように変更するだけで、XSLT パラメータに手動で挿入できます。これは、XML とプレーン テキストの両方で機能します。
ケース 2 ( marshalObjectToDocument()) の場合、ファイル パスがありません。XML 表現を含む巨大な文字列に変換されるオブジェクトがあります。ファイルがないため、ファイル パス文字列を渡すことができませんtransformDocument()。今は使えませんtransformDocument()。コードの再利用性が破壊されました。
これらすべてにおける私の目標は、XML ドキュメントとプレーン テキスト ドキュメントの両方を何らかの方法でコード内で同じように処理できるようにすることと、マーシャリングまたはアンマーシャリングに関係なく XSLT と XSD を適用するためにコードを再利用できるようにすることです。これは奇抜な目標ですか?ドキュメントの種類と方向ごとに異なるコードを書くことになる運命にあるのでしょうか? または、誰かがこれを回避する方法を見ることができますか?