4

SaxonHE9-4-0-6J をダウンロードし、CLI で XHTML を処理したいと考えています。しかし、Saxon は W3C から DTD を読み込もうとするため、単純なコマンドごとに時間がかかりすぎます。

私は xml カタログを持っています。これは、カタログ ファイルを指す環境変数を設定することで xmllint で正常に使用できますが、Saxon にそれを使用させる方法がわかりません。Google は、Saxon でのカタログの使用に関する変更の全履歴 (したがって混乱) を明らかにしましたが、私を満足させるものはありませんでした。

resolver.jar をダウンロードして CLASSPATH に設定しましたが、Saxon で使用できません。さまざまな組み合わせの後、次のようなカタログ変数のみを使用してhttp://www.saxonica.com/documentation/sourcedocs/xml-catalogs.xmlに従いました。

-catalog:path-to-my-catalog

(URIと通常のパスの両方を試しました)、、、スイッチを設定せず-r-x-ySaxonはそれを認識しません。次のエラーが表示されます。

クエリの処理に失敗しました: Apache カタログ リゾルバー ライブラリを読み込めませんでした

resolver.jar はクラスパスに設定されており、コマンドラインから使用できます:

C:\temp>java org.apache.xml.resolver.apps.resolver
Usage: resolver [options] keyword

Where:

-c catalogfile  Loads a particular catalog file.
-n name         Sets the name.
-p publicId     Sets the public identifier.
-s systemId     Sets the system identifier.
-a              Makes the system URI absolute before resolution
-u uri          Sets the URI.
-d integer      Set the debug level.
keyword         Identifies the type of resolution to perform:
                doctype, document, entity, notation, public, system,
                or uri.

OTOH、Saxon アーカイブ自体には既に XHTML やその他のさまざまな DTD が含まれているため、このフラストレーションから抜け出す簡単な方法があるはずです。

コマンドラインでSaxonを使用し、ローカルDTDを使用するように指示する方法は?

4

2 に答える 2

6

質問の saxonica リンクから:

コマンド ラインで -catalog オプションを使用すると、Saxon (9.4 以降) で使用される内部リゾルバーがオーバーライドされ、よく知られた W3C 参照 (XHTML DTD など) がこれらのリソースの Saxon のローカル コピーにリダイレクトされます。これらの機能はどちらも XML パーサーの EntityResolver の設定に依存しているため、組み合わせて使用​​することはできません。

これは、Saxon がよく知られている W3C DTDのローカル コピーを自動的に使用するように思えますが、 を指定する-catalogと、内部リゾルバーは使用されず、これらをカタログで明示的に指定する必要があります。


これは、Saxon でカタログを使用する実際の例です...

私の例のファイル/ディレクトリ構造

C:/so_test/lib
C:/so_test/lib/catalog.xml
C:/so_test/lib/resolver.jar
C:/so_test/lib/saxon9he.jar
C:/so_test/lib/test.dtd
C:/so_test/test.xml

XML DTD ( so_test/lib/test.dtd)

<!ELEMENT test (foo)>
<!ELEMENT foo (#PCDATA)>

XML インスタンス( so_test/test.xml)

カタログが使用されていることを確認するために、システム識別子は存在しない場所を指していることに注意してください。

<!DOCTYPE test PUBLIC "-//TEST//Dan Test//EN" "dir_that_doesnt_exist/test.dtd">
<test>
    <foo>Success!</foo>
</test>

XML カタログ( so_test/lib/catalog.xml)

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <group prefer="public" xml:base="file:///C:/so_test/lib">
        <public publicId="-//TEST//Dan Test//EN" uri="lib/test.dtd"/>
    </group>
</catalog>

コマンドライン

-dtd検証を有効にするオプションに注意してください。

C:\so_test>java -cp lib/saxon9he.jar;lib/resolver.jar net.sf.saxon.Query -s:"test.xml" -qs:"<results>{data(/test/foo)}</results>" -catalog:"lib/catalog.xml" -dtd

結果

<results>Success!</results>

XML インスタンスを無効にすると:

<!DOCTYPE test PUBLIC "-//TEST//Dan Test//EN" "dir_that_doesnt_exist/test.dtd">
<test>
    <x/>
    <foo>Success!</foo>
</test>

上記と同じコマンドラインを実行すると、結果は次のようになります。

Recoverable error on line 4 column 6 of test.xml:
  SXXP0003: Error reported by XML parser: Element type "x" must be declared.
Recoverable error on line 6 column 8 of test.xml:
  SXXP0003: Error reported by XML parser: The content of element type "test" must match "(foo)".
Query processing failed: The XML parser reported two validation errors

この例が、セットアップで何を変更すべきかを理解するのに役立つことを願っています。

また、この-tオプションを使用すると、ロードされたカタログや公開識別子が解決されたかどうかなどの追加情報が得られます。

Loading catalog: file:///C:/so_test/lib/catalog.xml
Saxon-HE 9.4.0.6J from Saxonica
Java version 1.6.0_35
Analyzing query from {<results>{data(/test/foo)}</results>}
Analysis time: 122.70132 milliseconds
Processing file:/C:/so_test/test.xml
Using parser org.apache.xml.resolver.tools.ResolvingXMLReader
Building tree for file:/C:/so_test/test.xml using class net.sf.saxon.tree.tiny.TinyBuilder
Resolved public: -//TEST//Dan Test//EN
        file:/C:/so_test/lib/test.dtd
Tree built in 0 milliseconds
Tree size: 5 nodes, 8 characters, 0 attributes
<?xml version="1.0" encoding="UTF-8"?><results>Success!</results>Execution time: 19.482079ms
Memory used: 20648808

追加情報

Saxon は Xerces の Apache バージョンを配布しているのでresolver.jarApache Xerces ディストリビューションにある を使用してください。

于 2013-01-05T03:35:28.730 に答える
1

Daniel Haley は、Saxon で明示的なカタログを使用する方法について、私よりもうまく答えてくれました。

よく知られている DTD の組み込みコピーの使用に関しては、Saxon 9.4 は、必要なリソースのシステム ID またはパブリック ID を認識する場合、デフォルトでこれを自動的に行います。W3C サイトに送信する場合、最初に検出する必要があるのは、使用している DOCTYPE の正確な形式です。

Apache カタログ リゾルバのロードの失敗に関するエラー メッセージは、実際には、Saxon がクラス org.apache.xml.resolver.CatalogManager をロードできなかったことを意味します。このクラスが含まれていないバージョンのリゾルバーを使用しているのだろうか? それ以外の説明が思いつきません。

于 2013-01-05T17:37:25.967 に答える