ページの結合
たとえば、複数のWebページで構成されたチュートリアルのように、自然な順番で表示される一連のWebページがあるとします。各ページには、前後のページや目次ページに移動するためのナビゲーションボタンがあります。ここに新しいページを追加したり、ページを削除したり、あるいはページの順序を変えたりする場合、静的なページを使用していると、おそらく、すべてのリンクを自分で編集しなくてはなりません。これは、時間がかかるうえに間違いを起こしやすい作業です。
このような連結されたページを図3に示します。各ページに、先頭ページと最終ページ、前のページと次のページ、そして親ページに移動するためのボタンがあります。XSLT変換のマッピングを適切に使用すれば、これらのナビゲーションの連結部分を、XmlTransformで自動的に生成することができます。
図3をよく見ると、すべてのページに「先頭ページ」および「最終ページ」に進むボタンが表示されることがわかります。それに対して、その間にある「戻る」「上へ」「進む」の3つのボタンは条件付きで表示されます。たとえば、先頭ページに「戻る」を表示したり、最終ページに「進む」を表示したくはありません。また場合によっては、2つのボタンが同じページを指すこともあります。たとえば2ページ目に表示される「先頭ページ」ボタンと「戻る」ボタンは、どちらも1ページ目に移動します。
「上へ」ボタンは、特にディレクトリ構造が深い場合に便利です。先に解説した目次の自動生成処理を思い出してください。一般的な慣例では、あるディレクトリについての「index.html」ファイルは、対象ディレクトリ内に置きます。しかしこの慣例に従うと、生成されるナビゲーションボタンは「index.html」を「戻る」ボタンや「進む」ボタンで移動できるページと同様のものとして扱うため、「上へ」ボタンで移動することができません。これを「親」にするためには、「index.html」を子よりも1つ上のディレクトリに置く必要があります。
しかし、複数のディレクトリについての目次を生成する場合はどうでしょうか。言うまでもなく、複数のファイルに「index.html」という同じ名前を付けることはできません。これを解決するために、XmlTransformでは、目次ファイルにディレクトリと同じ名前を付けるという方法を採用しています。つまり、「stuff」というディレクトリであれば「stuff.html」という目次ファイルが生成されるのです。
この2通りの要件を考慮し、XmlTransformでは目次ページの生成方法を選択できるようになっています。つまり、いつもの慣例に従いたい場合は同一ディレクトリに「index.html」という名前で生成し、より自然な階層モデルを使用したい場合(「上へ」ナビゲーションボタンを利用したい場合)は1つ上のディレクトリに「<ディレクトリ名>.html」という名前で生成することができます。
各Webページのナビゲーションボタンを生成するXSLTコードの一部をリスト1に示します。通常の<body>要素ではなく<cc:body>要素を使用すると、このXSLTが(検索ボックス、ロゴ、メニューなどを表示する他の多くのコードと一緒に)各Webページへ自動的に組み込まれます。あるページのナビゲーション部分として出力されたXHTMLコードの抜粋を以下に示します。よく見ると、このコードは図3の先頭ページ(access.html)からの抜粋であることがわかります。「戻る」ボタンの部分に矢印ではなく空白の画像が配置され、アクティブなリンクも作成されていないからです。
<span style="margin-left:10px" class="headerFont" title="Shortcut keys in Internet Explorer: 1=First, 2=Previous, 3=Next, 4=Last, 5=Up">NAVIGATION:</span> <span> <a href="accessibility.html"> <img src="/image/firstButton.gif" alt="first page in section" width="14" height="14" /> </a> <img src="/image/dot_clear.gif" alt="" width="14" height="14" /> <a href="../webRules.html"> <img src="/image/upButton.gif" alt="up one level" width="14" height="14" /> </a> <a href="antispam.html"> <img src="/image/nextButton.gif" alt="next page" width="14" height="14" /> </a> <a href="style.html"> <img src="/image/finalButton.gif" alt="final page in section" width="14" height="14" /> </a> </span>
ここまでの解説で、XmlTransformの基本的な動作と、目次ページを生成する機能、さらにファイル間のナビゲーションを自動化する機能について見てきました。この2つの機能は、XMLをHTMLに変換する場合に非常に便利ですが、その他のXMLダイアレクトに変換する場合には必要ないかもしれません。
XmlTransformの実行
XmlTransformを実行するには、以下のコンポーネントを読み込む必要があります。
- Java(バージョン1.5以上)。必要なのはJavaのランタイムエンジンだけです。持っていない場合はSunからダウンロードしてください。
- XML解析用Xercesライブラリ。
- XSLT変換用Xalanライブラリ。
- cleancode-javaオープンソースライブラリ。
- CleanCodeライブラリ(cleancode.jar)、Xercesライブラリ(xml-apis.jarとxercesImpl.jar)、およびXalanライブラリ(serializer.jarとxalan.jar)のJARファイルをJavaのクラスパスに追加する必要があります。
動作を確認するために、使用方法を表示するオプションを呼び出します。
> java com.cleancode.xml.XmlTransform --help
このコマンドを実行すると、利用可能なすべてのコマンドラインオプションが一覧で表示され、それぞれが1行で説明されます。
オプションの数が多いため、すべてのオプションをパラメータファイルに記述し、コマンドラインからパラメータファイルを参照するという方法も用意されています。その場合は、次の例のようにファイル名の先頭に@マークを指定します。
> java com.cleancode.xml.XmlTransform @myParams.dat
XmlTransformはパラメータファイル内のオプションを、コマンドラインから入力されたオプションと同じように扱います。ただし、シェル画面には表示されません。コマンドラインから特殊文字(引用符やリダイレクトなど)を直接入力すると、シェルが特殊文字を先に処理するために衝突が起こる場合もありますが、パラメータファイルを使用すれば回避できます。パラメータファイルのもう1つのメリットは、デフォルトのオプションセットを含むパラメータファイルを作成し、その設定を、コマンドラインで直接入力したオプションや別のパラメータファイルで指定したオプションによって上書きしたり、補足したりできるという点です。
たとえば、「inline.conf」というパラメータファイルに以下の3つのパラメータを記述したとします(わかりやすくするために架空のオプション名を使っています)。
--x1=2 --x2=4.3 --x3=true
そして、コマンドラインで以下のように指定します。
> java class_name --x1=4 @inline.conf --x4=0.5
すると、パラメータが挿入され、以下のコマンドラインを指定したのと同じことになります。
> java class_name --x1=4 --x1=2 --x2=4.3 --x3=true --x4=0.5
x1オプションは2回指定されることになりますが、最後に指定された値が採用されるため、x1の値は4ではなく2になります。したがって、デフォルトのオプションセットを含むパラメータファイルを使用し、そのオプションを必要に応じてコマンドラインから上書きしたい場合は、上記の例のようにパラメータファイルをオプション間に指定するのではなく、先にパラメータファイルを指定し、後からそれを上書きするためのオプションを直接入力します。
この手法のバリエーションとして、デフォルトのオプションセットを含むパラメータファイルを指定した後に、そのオプションの一部を書き換える別のパラメータファイルを指定することもできます。以下に例を示します。
> java class_name @default.dat @variation-one.dat

