1

XML 変換と Xpath のために、JDK のデフォルト実装 (Xalan だと思います) の代わりに Saxon を使用しようとしました。私のコードでは、document.createCDATASection(data) メソッドを使用して CDATA ノードを作成しています。コードは次のようになります。

    CDATASection cdata = doc.createCDATASection("data");
    Node valueNode = node.appendChild(doc.createElement("value"));
    valueNode.appendChild(cdata);

node は、XML のランダムなノードです。JDK のデフォルトの実装で問題なく動作し、結果の XML は次のようになります。

            <node>
             <value><![CDATA[data]]></value>
            </node>

Saxon maven アーティファクトをインクルードすると、同じコードが奇妙に動作し始めます (インクルードするだけで、以前のようにファクトリの選択/インスタンス化がデフォルトであることに注意してください)。すべての cdata ノードは単純なテキスト ノードとして扱われます。つまり、XML は次のようになります。

            <node>
             <value>data</value>
            </node>

そのコードは、後で削除されたcdata要素を明確にチェックするため、取得時に問題を引き起こしています。なぜこれが起こっているのかわかりません(正しく使用していないようです)。また、POM (Saxon の推移的な依存関係) から Xerces アーティファクトを除外しようとしましたが、うまくいきませんでした。また、JDK 自体から DocumentBuilderFactory などの実装クラスが使用されていることを確認しました。私が何か間違ったことをしている場合は、専門家が私を助けてください。

前もって感謝します。

4

1 に答える 1

1

あなたのアプリケーションはおそらく、DOM をシリアライズするために DOMSource から StreamResult への JAXP ID 変換を行っていると思います。JAXP ID 変換の Saxon 実装は、CDATA セクションを削除する効果を持つ XSLT のシリアライゼーション ルールを使用します。これは、デフォルトの JDK 実装の動作とは異なりますが、JAXP に完全に準拠しています。

JAXP ID トランスフォーマーの特定の実装の動作に依存している場合は、クラスパスにたまたま横たわっている実装をピックアップするようにアプリケーションを作成するべきではありません。必要な実装を明示的にインスタンス化する必要があります。

もちろん、恒等変換を呼び出すコードが自分で作成したものではなく、簡単に変更できない場合、これは困難な場合があります。その場合の最善の方法は、システム プロパティ javax.xml.transform.TransformerFactory を設定して Xalan を選択し、Saxon を呼び出したい場所で、JA​​XP ファクトリ検索に依存するのではなく、明示的に実行することです。

于 2013-06-06T18:28:03.480 に答える