0

この質問からの私の思考パターンの続きとして: 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 つの方向の比較です。

  1. unmarshalDocumentToObject()
    • ドキュメントを含むファイルから始めます。
    • 私はこれをします:new StreamSource(new File(documentLocation))
    • これは、「ソース」( ) としてStreamSourceに渡すことができます。transformDocumentXsltTransformer.setSource()
  2. marshalObjectToDocument()
    • ある種のオブジェクトから始めます。
    • これは、XML の巨大な文字列にマーシャリングされます。
    • 私はこれをします:new StreamSource(new StringReader(giantStringOfXML))
    • これは、「ソース」( ) としてStreamSourceに渡すことができます。transformDocumentXsltTransformer.setSource()

ケース 1 ( unmarshalDocumentToObject()) の場合、ファイル パスが入ってくるのでtransformDocument()、ファイル パス文字列を取得して渡すように変更するだけで、XSLT パラメータに手動で挿入できます。これは、XML とプレーン テキストの両方で機能します。

ケース 2 ( marshalObjectToDocument()) の場合、ファイル パスがありません。XML 表現を含む巨大な文字列に変換されるオブジェクトがあります。ファイルがないため、ファイル パス文字列を渡すことができませんtransformDocument()。今は使えませんtransformDocument()。コードの再利用性が破壊されました。

これらすべてにおける私の目標は、XML ドキュメントとプレーン テキスト ドキュメントの両方を何らかの方法でコード内で同じように処理できるようにすることと、マーシャリングまたはアンマーシャリングに関係なく XSLT と XSD を適用するためにコードを再利用できるようにすることです。これは奇抜な目標ですか?ドキュメントの種類と方向ごとに異なるコードを書くことになる運命にあるのでしょうか? または、誰かがこれを回避する方法を見ることができますか?

4

1 に答える 1

1

確かに、これはソフトウェアエンジニアリングの標準的で基本的なビットですか?ここには3ビットのコードがあります。変換を実行するアプリケーション。変換を実行するXSLTエンジンと、XSLTエンジンによって提供されるサービスの抽象化を提供するインターフェイス層。通常、アプリケーションが必要とするものだけを提供するように機能をサブセット化し、より単純な形式で実行します。インターフェイスレイヤーの利点は、変換APIの複雑さが軽減されることです。欠点は、機能も低下することです。アプリケーションが以前は隠されていた機能をさらに必要とし始めたら、いくつかの選択肢があります。インターフェイスレイヤーに機能を追加できます(最終的には付加価値がなくなるまで)、

コードの再利用は、複数の場所で使用できる機能の塊を特定することに依存します。アプリケーションのさまざまな部分がさまざまなことを実行している場合、コードの再利用が難しくなります。新着情報?

于 2012-05-23T16:02:35.550 に答える