インデックス (索引)の作成
次のxmlを見てください。1つの部屋ノードを持つ1つの機能レベルと1つの部屋ノードを持つ部屋コンテナが含まれています:
<drofus-xml> <room-container> <room id="123"> <core name="foobar"/> </room> </room-container> <level> <room ref="123"/> </level> </drofus-xml> |
---|
レベル構造をトラバース (横断)し、その下にある部屋の情報を表示するレポートを作成したいと思います。トラバースは、xpath式として
xpath式として/drofus-xml/levelを使用します。ただし、レベル・ノードの下にある部屋ノードは参照ノード (ref node) に過ぎず、
対応する部屋コンテナ/部屋ノードをリンクまたは参照することを意味します。参照ノードが使用されるのは、xml ファイル内の複数の場所で情報が重複するのを避けるためです。
2つの部屋ノードの間のリンクは、@ref属性の値が@id属性の値と等しいことです。
レベル・ノードをトラバースして部屋参照ノードを見つけた場合、対応する部屋ノードにはすべての部屋デー タが含まれるため、部屋ノードを取得する方法が必要です。
これを行うには、インデックスを作成します。これは、以下のxpath式をReview->Global XSLTウィンドウに手動で挿入することで行います。
<xsl:match key="room-index" match="room" use="@id"/> |
---|
room-index "と言うインデックスが作成され、xmlファイル内の@id属性を含む全ての部屋ノードが含まれます。
同じドキュメントに複数のインデックスを作成することも可能です。一意な名前が必要です。
レポートに、レベルの下にあるすべての部屋の部屋名を示す繰り返しテーブルを挿入したいと思います。そして、以下のxpath式でフィールドを挿入します:
key('room-index', @ref)/core/@name |
---|
ref属性を持つ部屋参照ノード (room ref node )のコンテキストにいます。この @ref 値を使用して、"room-index" というインデックスから一致する @id 値を持つ部屋ノードを取得します。
xpath式のkey('room-index', @ref)は、部屋ノードを返し、それは@name属性を持つコア・ノードを含んでいます。
重要:ビルディング・ブロックの xsl では、1 つ以上のインデックスを定義する必要がある場合があります。
これは、ビルディング・ブロックのレビュー (Review-)→グローバルXSLTウィンドウ (Global XSLT Window )で行うか、ビルディング・ブロックを使用するメイン・レポートで行います。