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パラメータがリソースを一意に識別しないため、前の階層の順序を見てどのファイルが要求されているのか推測できません。ファイルが要求されているコンテキストを正確に特定するためのトリックはありますか?
それが問題でした。私はURIResolverでデータベースに格納されたStringsから新しいStreamSourceオブジェクトを作成していましたが、システムIDを設定していませんでした。 StreamSourceオブジェクトにシステムIDが設定されたら、私が傍受しようとしていたURLまたはファイルの場所に、基本パラメータがresolve関数で設定され、正しいリソースを特定できました。ありがとうございました。 – Phyxx
「システムID」は何ですか? – Kalanamith
@SansaKirov http://www.w3.org/TR/REC-xml/#dt-sysid https://en.wikipedia.org/wiki/System_identifier – prunge