この質問からの私の思考パターンの続きとして: 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
に渡すことができます。transformDocument
XsltTransformer.setSource()
marshalObjectToDocument()
- ある種のオブジェクトから始めます。
- これは、XML の巨大な文字列にマーシャリングされます。
- 私はこれをします:
new StreamSource(new StringReader(giantStringOfXML))
- これは、「ソース」( ) として
StreamSource
に渡すことができます。transformDocument
XsltTransformer.setSource()
ケース 1 ( unmarshalDocumentToObject()
) の場合、ファイル パスが入ってくるのでtransformDocument()
、ファイル パス文字列を取得して渡すように変更するだけで、XSLT パラメータに手動で挿入できます。これは、XML とプレーン テキストの両方で機能します。
ケース 2 ( marshalObjectToDocument()
) の場合、ファイル パスがありません。XML 表現を含む巨大な文字列に変換されるオブジェクトがあります。ファイルがないため、ファイル パス文字列を渡すことができませんtransformDocument()
。今は使えませんtransformDocument()
。コードの再利用性が破壊されました。
これらすべてにおける私の目標は、XML ドキュメントとプレーン テキスト ドキュメントの両方を何らかの方法でコード内で同じように処理できるようにすることと、マーシャリングまたはアンマーシャリングに関係なく XSLT と XSD を適用するためにコードを再利用できるようにすることです。これは奇抜な目標ですか?ドキュメントの種類と方向ごとに異なるコードを書くことになる運命にあるのでしょうか? または、誰かがこれを回避する方法を見ることができますか?