2011-10-17 11 views
1

Java/Xalanと公式のDocbook XSLファイル(https://sourceforge.net/projects/docbook/files/docbook-xsl/1.76.1/)を混在させて、いくつかのDocbook XSLをHTMLに変換しようとしましたが、いくつかのカスタマイズと上書きを提供するxslファイルがあります。URIResolver、Docbook、XSL Transform

私のアプリケーションが外部リソースをダウンロードしたり、ローカルファイルにアクセスしたりするのを防ぐためです。そこで、URIResolverインタフェースを拡張したクラスを実装しました。

問題は、resolve(final String href, final String base)関数が、要求されている特定のファイルを識別するのに十分な情報を提供していないことです。

たとえば、ローカルオーバーライドファイルの1つは、<xsl:import href="../../../xsl/html.xsl"/>を使用してxslファイルからインポートされます。この場合、リゾルバクラスのhrefパラメータは../../../xsl/html.xslに設定されます。これは問題ありません。 html.xslファイルはdefaults.xslというファイルをインポートします。 hrefパラメータはdefaults.xslにのみ設定され、baseパラメータはnullに設定されます。

これに続いてhttp://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xslのインポートがあります。この場合、hrefパラメータはhttp://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xslに設定されます。ただし、docbook.xslがdefaults.xslというファイルをインポートする場合、hrefパラメータもdefaults.xslに設定され、baseはnullに設定されます。

問題は、hrefとbaseパラメータがリソースを一意に識別しないため、前の階層の順序を見てどのファイルが要求されているのか推測できません。ファイルが要求されているコンテキストを正確に特定するためのトリックはありますか?

答えて

2

トランスフォームを作成するソースにシステムIDがありますか?そうでない場合は、URIリゾルバで基数が常にnullになっている可能性があります。

入力ストリームから変換を作成する場合は、ソースにシステムIDを手動で割り当てることができます。必要に応じて擬似URIを生成し、そのURIリゾルバでその人工URIを使用してベースURIにマップすることができます。また、URIリゾルバで作成したソースにシステムIDが含まれていること、またはそれらのファイルからインポートされたリソースで同じ問題が発生することも確認してください。

+0

それが問題でした。私はURIResolverでデータベースに格納されたStringsから新しいStreamSourceオブジェクトを作成していましたが、システムIDを設定していませんでした。 StreamSourceオブジェクトにシステムIDが設定されたら、私が傍受しようとしていたURLまたはファイルの場所に、基本パラメータがresolve関数で設定され、正しいリソースを特定できました。ありがとうございました。 – Phyxx

+0

「システムID」は何ですか? – Kalanamith

+0

@SansaKirov http://www.w3.org/TR/REC-xml/#dt-sysid https://en.wikipedia.org/wiki/System_identifier – prunge