XSL スタイルシートを使用して、Web ブラウザーで表示するときにフォーマットする xml ファイルがあります。xml ファイルは、同僚がアクセスできる共有ドライブである中央の場所に保存します。XML ファイルを共有の場所から直接開くと、正しく表示されますが、必要な XML ファイルだけを XML のコピーとして取得することがあります。ブラウザでファイルを表示すると、XSL スタイルシートが見つからないため、レンダリングされません。xsl スタイルシートが利用可能かどうかを判断する方法はありますか。そうでない場合は、スタイルシートの使用を無視して、スタイルシートがないかのように xml ファイルを表示します。基本的に、これは、ローカル コピーが作成されたときにエラーが発生しないことを意味します。これはできますか
2 に答える
<?xml-stylesheet?>
おそらく、処理命令に依存しています。スタイルシートが見つからない場合にこれがどのように動作するかをパラメータ化する方法はわかりません。とにかくブラウザに依存すると思います。
ネットワーク上のどこからでもスタイルシートをフェッチできる絶対URIを使用してみませんか?クロスサイトスクリプティングの問題が発生する可能性がありますが、試してみる価値はあります。
それを行うためのきちんとした方法はないと思います。次のように、インポート時に use-when 属性を使用できます...
<xsl:import
xmlns:fn="http://www.w3.org/2005/xpath-functions"
href="'general.xslt'"
use-when="fn:unparsed-text-available( 'general.xslt') />
上記の要素は、スタイルシート 'general.xslt' が存在する場合、それをインポートします。このソリューションの問題/制限は、@href 属性の場合、XSLT が xslt の構成 (OASIS カタログ、コマンド ライン パラメーター、環境変数など) から general.xslt を見つける場所を認識していることです。これはベンダー固有です)。ただし、URI パラメータを取る unparsed-text-available() には、同じ位置検出ロジックは適用されません。
したがって、上記の要素を次のようにパラメータ化することもできます...
<xsl:import
xmlns:fn="http://www.w3.org/2005/xpath-functions"
href="$stylesheet-to-import"
use-when="fn:unparsed-text-available( $uri-of-stylesheet-to-import) />
ここで、次のことを前提としています。
- $stylesheet-to-import は、インポートするスタイルシートのパラメーター/変数です。XSLT エンジンによってこのように配置できる場合は短い形式にすることができます。それ以外の場合は、$uri-of-stylesheet-to-import と同じにする必要があります。
- $uri-of-stylesheet-to-import は、インポートするスタイルシートが存在する場合、その uri です。
- $uri-of-stylesheet-to-import が指すファイルが存在する場合、それは有効な xslt ファイルです。
このソリューションは XSLT 2.0 でのみ機能すると思います。XSLT 1.0 についてはよくわかりません。
この同様の質問に対する Dimitre の回答もお読みください: XSL を使用して外部ファイルの存在を確認するにはどうすればよいですか? .
注: fn:unparsed-text-available() の代わりに、fn:doc-available() を使用することもできます。ドキュメントが有効な XML であることを確認するため、処理が遅くなります。問題によっては、これが良い場合とそうでない場合があります。