目次ページの自動作成
図2は、XmlTransformの機能を使用して、Webセクションの目次ページに兄弟ページまたは子ページの要素から自動的にデータを読み込む仕組みを示しています。<title>要素の一部と、特定の<meta>要素の一部を指定されたページセットの各ページから抜き出し、それらを組み合わせて1つの目次ページにしています。この方法であれば、セクションにページを追加または削除した場合でも、XmlTransformを再度実行するだけで更新された目次ページを生成できます。
図1をもう一度見てください。変換先のツリーにファイルが生成されているだけでなく、変換元のツリーにも中間の「目次」ファイル(ピンク色のファイル名)がいくつか生成されています。目次ファイル用のテンプレートを「_index.xml」という名前で作成し、このテンプレートを対象ファイルが含まれるディレクトリに格納すると、XmlTransformによってサマリ情報がテンプレートに挿入されます。たとえば、図2の出力の生成に使用された「_index.xml」ファイルを以下に示します。
<?xml version="1.0"?> <cc:cleanCodeDoc> <cc:head> <cc:title>CleanCode::Web Guidelines</cc:title> <cc:id>$Id: _index.xml 20 2006-12-29 00:03:27Z dellxp $</cc:id> <cc:version>$Revision: 20 $</cc:version> <cc:generator/> </cc:head> <cc:body> <h1>Web Guidelines</h1> <h2>Design Considerations for Web Sites</h2> <cc:files group=""/> <br /> </cc:body> </cc:cleanCodeDoc>
この「_index.xml」テンプレートファイルは、ソースツリー内の残りのファイルと一緒に変換される前に、特別な処理が施されます。ここで、同じディレクトリ内のファイルの情報が差し込まれます。この処理は、上記のテンプレートコードの<cc:files>要素を使って制御します。テンプレートにデータが挿入された後、それが変換元ツリー内の「web info.xml」という中間ファイル(図1を参照)に書き出され、続いて、残りの変換処理が実行されます。この中間ファイル(web info.xml)の該当する部分を以下に示します。上記のテンプレートと比較して見ると、同じディレクトリ内の他のファイルの情報が<cc:files>要素に入力されていることがわかります。
<?xml version="1.0"?> <cc:cleanCodeDoc> <cc:head> <cc:title>CleanCode::Web Guidelines</cc:title> <cc:id>$Id: _index.xml 20 2006-12-29 00:03:27Z dellxp $</cc:id> <cc:version>$Revision: 20 $</cc:version> <cc:generator/> </cc:head> <cc:body> <h1>Web Guidelines</h1> <h2>Design Considerations for Web Sites</h2> <cc:files group=""> <cc:file> <cc:relfile>webRules/accessibility.html</cc:relfile> <cc:absfile>/usr/doc/webRules/accessibility.xml</cc:absfile> </cc:file> <cc:file> <cc:relfile>webRules/antispam.html</cc:relfile> <cc:absfile>/usr/doc/webRules/antispam.xml</cc:absfile> </cc:file> <cc:file> <cc:relfile>webRules/browser.html</cc:relfile> <cc:absfile>/usr/doc/webRules/browser.xml</cc:absfile> </cc:file> <cc:file> <cc:relfile>webRules/cssConformance.html</cc:relfile> <cc:absfile>/usr/doc/webRules/cssConformance.xml</cc:absfile> </cc:file> . . . </cc:files> <br /> </cc:body> </cc:cleanCodeDoc>
目次ページのテンプレートには、その他のHTMLを何でも含めることができます。XmlTransformにとって重要なのは、生成した目次の挿入先を示すマーカー要素(<cc:files>)だけです。上記の例は、<h1>と<h2>のヘッダ要素のみを追加する非常に基本的なページを表示します。この時点で、中間ファイルを他のすべての参照ページと一緒にXSLT変換で処理できる状態になります。以下に、前述の中間ファイルXMLをXHTMLに変換する「translate.xsl」ファイルから抜粋した、他のページを参照している部分のコードを示します。
<xsl:template match="cc:files"> <xsl:apply-templates/> </xsl:template> <xsl:template match="cc:file"> <xsl:variable name="extNode" select="document(cc:absfile)/cc:cleanCodeDoc"/> <div class="guidelink"><a href="{cc:relfile}"> <xsl:call-template name="trim"> <xsl:with-param name="s"> <xsl:value-of select="$extNode/cc:head/cc:title"/> </xsl:with-param> </xsl:call-template> </a>:<xsl:text> </xsl:text> <xsl:value-of select= "$extNode/cc:head/xhtml:meta[ @name='description']/@content"/> </div> </xsl:template>
この短いXSLTコードの各要素をよく見て図2の表示画面と比較すると、該当する情報だけが抽出されていることがわかります(具体的なコードは掲載しませんでしたが、上記のXSLTコードで呼び出しているtrim関数は、コロンで区切られた文字列の最後の項を返します。これは著者のコーディングスタイルであり、いつもそうすると決めているだけで特に深い意味はありません)。最後に、このXSLT変換によってレンダリングされた最終的なXHTMLページの中から、関係のある部分を以下に紹介します。
<body> . . . <h1>Web Guidelines</h1> <h2>Design Considerations for Web Sites</h2> <div class="guidelink"> <a href="webRules/accessibility.html"> Accessibility</a>: Don't discriminate on physical ability when you design web pages. </div> <div class="guidelink"> <a href="webRules/antispam.html"> Anti-Spam</a>: Design defensively so you do not make it easy for spammers to enlist you to help them. </div> <div class="guidelink"> <a href="webRules/browser.html"> Browser Compliance</a>: Design economically by considering the technology of your audience. </div> <div class="guidelink"> <a href="webRules/cssConformance.html"> CSS Conformance</a>: Use CSS to improve your design, reduce duplication, and simplify maintenance, but getting it right can be a challenge. </div> . . .
この例では、グループ分けされていない目次ファイルが生成されます。つまり、すべての項目が目次ページ上の1つのリストに配置されます。必要であれば、項目をグループ分けし、各グループに名前を付けて読みやすくすることもできます。たとえば、個々の目次項目グループの前に説明の段落を挿入することも可能です。さらに、ディレクトリごとの目次テンプレートを指定し、ディレクトリの内容に合わせてレイアウトを変えることも可能です。
ここで解説した目次(サマリ)ページから、階層レベルを1つ下にドリルダウンするための仕組みが理解できたと思います。以降では、残りの方向、つまり上方向へのナビゲーションと、同レベルでのナビゲーションについて解説します。その場合、生成された目次ファイルがどこに置かれるのか気になるところですが、これについても取り上げていきます。

