1

XSLT 2.0 を使用して XML ファイルを XHTML に変換しています。変換には saxon9 プロセッサを使用しています。変換中に、次のようなエラーが発生します

java.io.FileNotFoundException: c:\test\book.dtd (指定されたファイルが見つかりません)。

XML には PUBLIC ID を持つ DOCTYPE 宣言があるため、DTD を探しています。

このエラーを解決するための解決策を探していましたが、それを行うことができません。私は resolver.jar で試しました。

私は resolver.jar をダウンロードし、saxon.jar と同じ場所に配置し、次のコマンド ラインを試しました。

java -cp c:/saxon9/saxon9.jar;c:saxon9/resolver.jar; net.sf.saxon.Transform -x:org.apache.xml.resolver.tools.ResolvingXMLReader -t -s:c:/test/sample2.xml -xsl:c:/test/body.xsl >c:/test/out /output.html

同じエラー メッセージが表示されます。

resolver.jar を使用するためにいくつかの Web サイトを参照しましたが、指示が明確ではなく、目的の出力が得られません。

http://sourceforge.net/apps/mediawiki/saxon/index.php?title=XML_Catalogsを見つけました。これは、resolver.jar を使用して DOCTYPE 宣言を省略する正しい解決策ですか? もしそうなら、これを使用する方法について親切に助けてください、または使用できる他の方法はありますか?

私のXMLファイルは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//ES//DTD book DTD version 5.3.0//EN//XML" "book.dtd" [<!  ENTITY fx1 SYSTEM "fx1" NDATA IMAGE>]>
<chapter>
<info>
<ce:link locator="fx1"/>…

以下のようにcatalog.xmlファイルを作成し、同じ場所に保存しました。

<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="-//ES//DTD book DTD version 5.3.0//EN//XML" uri="book.dtd"/>
</catalog>

環境変数のクラスパスも次のように定義しました。

c:\saxon9\saxon9.jar;c:\saxon\resolver.jarUsed the following command line for conversion(referred http://sourceforge.net/apps/mediawiki/saxon/index.php?title=XML_Catalogs)

しかし、私はまだ同じ問題に直面しており、正確な問題がどこにあるかを見つけることができず、他に何をする必要がありますか?

C:\>java -cp c:\saxon9\saxon9.jar;c:\saxon9\resolver.jar -Dxml.catalog.files=c:\saxon9\catalog.xml net.sf.saxon.Transform -r:org.apache.xml.resolver.tools.CatalogResolver  -x:org.apache.xml.resolver.tools.ResolvingXMLReader -y:org.apache.xml.resolver.tools.ResolvingXMLReader -xsl:c:\test\body1.xsl -s:c:\test\Main.xml -o:c:\test\output.html

しかし、次のエラーが発生します

Error java.io.FileNotFoundException: c:\test\book.dtd (The system cannot find the file specified)
Transformation failed: Run-time errors were reported

これは非常に緊急であるため、タイムリーなサポートに非常に感謝しています...

4

3 に答える 3

2

xmllint ツールが役に立ちました。

xmllint --dropdtd -o file.xml file.xml

Thomas が述べたように、結果を saxonb にパイプできます。

xmllint --dropdtd file.xml | saxonb-xslt -s:- -xsl:stylesheet.xsl
于 2016-10-24T07:36:50.463 に答える
0

入力XMLファイルのdoctype宣言の形式に大きく依存します。Saxonは「C:\ test \ book.dtd」を探しているので、外部識別子が存在するように聞こえます。したがって、次のいずれかのようなものがあります。

1. <!DOCTYPE book PUBLIC "some-public-id" "c:\test\book.dtd">

2. <!DOCTYPE book SYSTEM "c:\test\book.dtd">

基本的な問題は、システム識別子の部分( "c:\ test \ book.dtd")がハードデフォルトであるということです。カタログメカニズムを使用してDTDの他の場所をポイントしない限り、常に検索されます。(これは、私たちが生きなければならないXML仕様の欠陥です。)

ビジネスの最初の順序は、ソースXML形式のDTDがあるかどうかです。取得せず、取得できない場合、唯一のオプションは、ソースXMLを前処理し、Doctype宣言の外部識別子部分全体(つまり、上記の2つの形式のいずれか該当するもの)を削除することです。内部サブセット(「[」と「]」の区切り文字のペアの間の他の宣言)がない限り、Doctype宣言全体を削除しても問題ありません。

DTDがある場合は、c:\ test\book.dtdにコピーを置くことができます。それを望まない場合は、カタログメカニズムを使用して、Saxon(およびそのリゾルバー)を目的の場所にポイントする必要があります。クラスパスにresolver.jarを配置するだけでは不十分です。また、それを操作するために何かを与える必要があります!

特に、カタログファイルを指定する必要があります(xml.catalog.files環境変数を介して-ドキュメントの例のコマンドラインに注意してください)。また、入力XML形式のDTDのカタログにエントリが必要です。これにより、システム識別子'c:\ test \ book.dtd'(および/またはソースXMLにdoctype宣言にパブリック識別子がある場合はパブリック識別子)が、DTDを配置したファイルシステム内の場所にマップされます。

于 2012-12-26T16:02:59.977 に答える
0

Linux システムを使用している場合は、たとえば sed を使用して DOCTYPE 宣言を取り除き、結果を次のように Saxon にパイプすることができます。

sed '/<!DOCTYPE/d' in.xml | saxonb-xslt -s:- -xsl:stylesheet.xsl
于 2012-12-26T07:49:53.230 に答える