Saxonのドキュメントを見ると、コマンドラインに「-x:className」フラグがあり、XSLTの適用中に使用する特定のSAXパーサーを指定できます。
これをプログラムでどのように達成しますか?現在、コードでs9apiを使用しており、、、、、およびオブジェクトをチェックProcessor
しました。それらのどれもSAXパーサーを設定する方法がありません。また、をインスタンス化しましたが、それにも何もありませんでした。XsltCompiler
XsltExecutable
XsltTransformer
net.sf.saxon.Transform
私はおそらく間違ったオブジェクトのセットを見ていますが、正しいセットが何であるかをどのように知る必要があるのかわかりません。
上記の「ソースファイルおよびdocument()関数を使用してロードされたすべてのファイルに指定されたSAXパーサーを使用する」にリンクされているコマンドラインドキュメント。私が何をしているのかを知っていれば、この " document()
"関数の言及はすぐに私を手がかりにするでしょう。残念ながら、私はそうではありません。
編集:以下のマイケルケイの答えは正しいものです。(もちろんそうです!彼はサクソン人です!)私は将来の世代のためにいくつかのサンプルコードを追加すると思いました。
まず、以下を使用した彼の解決策net.sf.saxon.s9api.Processor
:
Processor processor = new Processor(false);
processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS,
"fully.qualified.package.name.of.MySAXParser");
上記では、SAXParserの完全修飾名(クラス名だけでなく)を文字列として指定することが重要です。次の場合:
processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS,
new MySAXParser());
...あなたはこれを得るでしょう:
java.lang.IllegalArgumentException: SOURCE_PARSER_CLASS class must be a String
第二に、彼の解決策はnet.sf.saxon.s9api.XsltTransformer
:
// ^^^ Various setup code to get to this point...
XsltTransformer transformer = xsltExecutable.load();
File file = new File("/path/to/my/file");
InputStream fileInputStream = new FileInputStream(file);
InputSource inputSource = new InputSource(fileInputStream);
Source saxSource = new SAXSource(new MySAXParser(), inputSource);
transformer.setSource(saxSource);
// vvv Set other parameters, actually invoke the transform, etc...
私の唯一の問題/警告は次のとおりです。
1.)次のメッセージがコンソールに出力されます。
Cannot find CatalogManager.properties
変換はまだ問題なく機能するため、これは何の影響も及ぼさないようです。Saxon自体とは実際には何の関係もないと確信していますが、カスタムSAXParserの実装内で混乱しています。
2.)非XMLドキュメントを変換したい場合(はい、完全に可能です)XsltTransform.setSource()を呼び出すと、デフォルトでソースがXMLドキュメントとして表示されるため、ソリューション#2を使用できません。あなたに恐ろしいものを与えるでしょう
Error on line 1 column 1
SXXP0003: Error reported by XML parser: Content is not allowed in prolog.
したがって、非XMLドキュメントを変換するには、「粗粒度」のプロセッサソリューションを使用する必要があります。