0

具体的な詳細に入る前に、以前に Oracle のparser.v2XSLT ライブラリでこれを試したところ、同じ問題に遭遇しました (私の最初の質問を参照してください)。ただし、C# を使用すると問題なく動作します。

// from the example I see everywhere on the internet
SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();

Templates t_cctagstrip = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\first.xsl")));
Templates t_cctable = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\second.xsl")));

TransformerHandler th1 = stf.newTransformerHandler(t_cctagstrip);
TransformerHandler th2 = stf.newTransformerHandler(t_cctable);

// transform 1 pipes into transform 2
th1.setResult(new SAXResult(th2));

// transform 2 pipes to System.out
th2.setResult(new StreamResult(System.out));

Transformer t = stf.newTransformer();
t.transform(new StreamSource(new FileInputStream("C:\\path\\to\\source.xml")), new SAXResult(th1));

おそらく問題は、最初の変換からの出力がルートレベルのテキストを含むフラグメントであるという事実にあると思いますか?

text at root level
<tag> ... tags that need extra processing ... </tag>
more text at root level

C# が変換を処理する方法に違いはありますか? 失敗したり、私が知ることができる警告を表示したりしていません。何も変わっていないだけです。

4

1 に答える 1

1

最初の質問では、ログ メッセージの提供など、直面している実際の問題について言及していないため、XSLT 変換が失敗する理由を知ることは不可能でした。しかし、この 2 番目の質問では、物事がうまくいかない理由を明確に示しています。

一般に、XSLT 変換では、解析されるすべてのコンテンツが少なくとも整形式の XML である必要があります。ソース ドキュメントが「ルート」要素 (実際にはdocument 要素と呼ばれる) でラップされていない場合、それは整形式の XML ではなく、定義上 XML ではないため、XML 処理には適していません。

解決策として、最初の変換からの出力をドキュメント要素でラップできる場合は、引き続き XML として解析できます。その後、非 XML プロセスを介して後で削除できます。

この点では、Java と C# の間に違いはありません。最初の変換からの出力が整形式の XML でない場合、C# はそれを XML として受け入れません。その理由を説明することはできません — C# の XML プロセッサは、整形式でない XML を受け入れると非準拠になります。出力が得られない理由は、非 XML ソースが原因で変換が単に失敗しているためだと思います。実際に何が起こっているかを知るためにjavax.xml.transform.ErrorListener、Transformer に を設定し、ErrorListener ですべてをログにダンプします。

(少し接線として、オラクルの XSL プロセッサを使用する必要があるとも述べています。本当ですか?オラクルの実装には、Xalan や Saxon では利用できない機能がいくつかあるに違いないと思います。 JAXP API を使用するのではなく、コードを実装に結び付ける (これは確かに推奨される方法ではありません) API にコーディングするときは、問題が実装に依存していないことを確認するために問題をデバッグすることをお勧めします。実装の内部コードを変更し、オラクルの欠陥ではなく、自分の欠陥のみをデバッグする方がよい.しかし、上記のコード例がJAXP APIを使用しているように見える場合、問題は実際にはオラクルのXSLProcessorに関連付けられていないと仮定します. .)

于 2012-08-17T02:53:00.667 に答える