引数などでスタイルシートを切り替えたい
Cocoonの環境下で、複数のXSLTスタイルシートを作りました。これにフォームやリンクから引数を与えることによって、Webブラウザから同じXML文書を要求する場合でも、異なるスタイルシートを適用させる、といったことはできるでしょうか。

回答/富士ソフトABC株式会社 技術センター
2002/1/18

 まず、ご質問に答えるために作成したサンプルの内容を、下記に簡単な図としてまとめてみました。1つのXML文書に対して、複数のスタイルシートを用意し、それをラジオボタンで操作する、という例を示したいと思います。

図1 質問の内容

 この動作を実現する方法はいくつかありますが、今回はTomcatとCocoonの環境で、CocoonのXSP(eXtensible Server Pages)を使用したサンプルプログラムを作成しました。以下の環境で動作確認しています。

  • Windows 2000 Server (SP2)
  • JDK 1.3.1_01
  • Tomcat 3.2.3
  • Cocoon 1.8.2
  • Internet Explorer 6 (Webブラウザとして)

 今回作成したサンプルの仕組みを簡単に説明します。

(1)スタイルを選択するためのページを用意する

 ラジオボタンを用意し、これを操作することによってユーザーがスタイルシートを選択できるようにします。ソースコードを参照してもらえれば、呼び出すXML文書は1つで、スタイルシートは複数あることが分かるでしょう。

画面1 スタイルシートを選択するラジオボタン

 

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="jp">
   <head>
     <title> ボタンを選んで表示の仕方を変えよう! </title>
   </head>
     <body>
       <h3>XSLを切り替えて表示の仕方を変えよう</h3>
       <table border="2" cellpadding="10">
         <tr><td>
         <form action="sample.xml">
           <!-- ラジオボタンを表示しスタイルを選択します -->
           <fieldset>
             <legend>表示したいスタイルを選択してください</legend>
             <input type="radio" name="Radio" value="1" checked="checked" accesskey="1" id="radio1">
               <label for="radio1">Noとタイトル (<u>1</u>)</label>
             </input><br/>
             <input type="radio" name="Radio" value="2" accesskey="2" id="radio2">
               <label for="radio2">日付とタイトル (<u>2</u>)</label>
             </input><br/>
             <input type="radio" name="Radio" value="3" accesskey="3" id="radio3">
               <label for="radio3">キーとタイトル (<u>3</u>)</label>
             </input><br/>
             <input type="radio" name="Radio" value="4" accesskey="4" id="radio4">
               <label for="radio4">媒体とタイトル (<u>4</u>)</label>
             </input><br/>
           </fieldset><br/>
         <!-- 共通のXML文書に選択したスタイルを適用して表示します -->
         <input type="submit" name="Submit" value="送信"/>
       </form>
     </td></tr>
     </table>
   </body>
</html>
リスト1 選択肢を表示するためのラジオボタン(StyleSelect.xml

(2)スタイルシート(XSLT)を用意する

 選択肢に応じたスタイルシートを用意します。今回のサンプルでは、style_1.xslstyle_2.xslstyle_3.xslstyle_4.xsl の4種類を用意しています。

(3)XML文書内でクライアントからの要求を処理する

 選択されたラジオボタンに応じたスタイルシートをXML文書に組み込みます。

 <xsp:logic>
  String style = new String();
    style = "href=\""
      + "style_"
      + String.valueOf(<request:get-parameter name="Radio"/>)
      + ".xsl"
      + "\" type=\"text/xsl\"";
    document.appendChild(
    document.createProcessingInstruction("xml-stylesheet", style )
  );
</xsp:logic>
リスト2 ラジオボタンによって選択された値を読み込んで、それに従ってスタイルシートを適用する

 上記リストの4〜6行目で、ラジオボタンの選択に応じたスタイルシートのファイル名を生成しています。例えば、ラジオボタンの(1)が選択された場合には、ファイル名は「style_1.xsl」となります。8〜10行目で、最終的にDOMレベルで次のようなスタイルシート宣言をXML文書に追加しています。

 <?xml-stylesheet href="style_1.xsl" type="text/xsl"?>

 このようにして、XML文書に最初からスタイルシート宣言があったようにDOM上のXML文書を変更します(sample.xml)。

(4) 要求したスタイルが適用されて表示されることを確認する

 選択した結果が反映されて表示されることを確認してください。

画面2 選択されたスタイルシートが適用されたXML文書

 このサンプルでのポイントは、クライアント側からの要求に従ったスタイルシートの宣言をDOMレベルでXML文書に組み込み、あたかも初めから宣言されていたかのように振る舞うところです。今回紹介した方法のほかにも、FPタグセットを使用する方法も考えられますが、基本的にスタイルシートをDOMレベルで差し替える部分は変わりません。

 IISとASPの組み合わせでも同様の方法を用いれば同じことができます。詳しくは説明しませんが、「集中連載:IISでXMLを操作する」などの記事を参考にしてください。

 

「Ask XML Expert」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間