4

Saxonのドキュメントを見ると、コマンドラインに「-x:className」フラグがあり、XSLTの適用中に使用する特定のSAXパーサーを指定できます。

これをプログラムでどのように達成しますか?現在、コードでs9apiを使用しており、、、、、およびオブジェクトをチェックProcessorしました。それらのどれもSAXパーサーを設定する方法がありません。また、をインスタンス化しましたが、それにも何もありませんでした。XsltCompilerXsltExecutableXsltTransformernet.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ドキュメントを変換するには、「粗粒度」のプロセッサソリューションを使用する必要があります。

4

1 に答える 1

1

Saxonの質問に対する回答を確実に取得したい場合は、dev.saxonica.comのSaxonフォーラム、またはSourceForgeのsaxon-helpリストを使用してください。

答えは:あなたは使用することができます

Processor.setConfigurationProperty(
    FeatureKeys.SOURCE_PARSER_CLASS, parserClassName)

ただし、これは少し粗い場合があります。構成は通常、1つのドキュメントを変換するためだけに設定されるため、コマンドラインで機能します。より細かく制御するために、使用するSAXパーサーのインスタンスを表すXMLReaderを含むSAXSourceオブジェクトの形式で変換への入力をいつでも提供できます。

于 2012-07-12T11:24:13.303 に答える