グループ化されたアイテムリスト
ファイル名: | Item list group.xfd |
---|---|
レベル: | Advanced |
レポートから XML: | Item -> FF&E list -> FF&E list grouped by FF&E level |
XMLサンプルファイル: | xml/file_with_cost.xml |
キーコンセプト: | Dynamic indentation, condition, table repeat, key/index |
このレポートは、FF&Eアイテムを含む階層的なFF&Eカタログ構造を印刷する方法を示しています。レポートは、FF&Eカタログ構造を表す<level>構造を走査します。
そのために、<level>ノードの上に繰り返しセクションがあります。 重要なのは、<level>ノードは階層構造を表すために互いに入れ子になっていることです。
このため、単純に最初のレベルをドキュメントにドラッグ&ドロップし、作成された式 (/drofus-xml/level) の上に繰り返しセクションを作成します。
この式が機能しないのは、トップ・レベルの<level>ノードだけを繰り返し処理し、サブ・レベルは行わないからです。
これを実現するには、XML構造のどこに配置されているかに関係なく、ドキュメント内のすべての<level>ノードを選択する式を使用します。この式は:
//level |
---|
サブ・グループのインデントを取得するには "Alignment & Indentation (整列とインデント) -> Start Indent (開始インデント)" プロパティの動的な値を次のように設定します:concat(@depth*5,'mm'). これは、グループ (トップ・レベル) には 0、サブ・グループなどには 1 となるレベルの深さ属性を使用します。
これに 5 を乗算し、その結果をミリメートル単位の長さ単位を与える mm と連結します。インチを得るにはincを使います。
これは、グループには0、サブ・グループには5、サブ・サブ・グループには10といったインデントを与えます。
各グループの下には、FF&Eアイテム (物品) のテーブルがあります。テーブルは条件セクションの中にあり、条件はcount(article) > 0で、グループ内にアイテムがなければfalseを返します。
これにより、テーブル・ヘッダーが必要ないときに表示されるのを防止できます。条件付きセクションは、Insert (挿入)→ Conditional Section (条件付きセクション)から挿入できます。
3.6で説明したように、テーブルにはテーブル・ヘッダーと繰り返し可能な行があります。XPATH式の物(article)を使用してください。
xmlソースでは、レベル・ノードは<article>という子ノードを持ち、これはFF&Eアイテムを表します。このノードには、/drofus-xml/article-container ノードの下にある article アイテムへの ID を含む @ref という属性が 1 つだけあります。FF&Eアイテムのデータを取得するには、この同じIDを持つ正しい<article>ノードの下で検索を行う必要があります。
これを効率的に行うために、使用可能なインデックスを作成します。インデックスについては5.3を参照してください。
これを行うには、以下のコードをReview (レビュー)->Global XSLT window (グローバルXSLTウィンドウ)に貼り付けます。
<xsl:key match="article" name="article-index" use="@id"/> |
---|
これは、id属性に基づいてすべての<article>ノードにインデックスを作成します。
例えばFF&E番号列のようなテーブル列を作成するには、Insert (挿入)→Field (フィールド)を選択し、以下のXPATH式を入力します。
key('article-index', @ref)/core/@article_func_no |
---|
もちろん、このフィールドを他の列にコピー・ペーストすることもできます。利用可能なフィールドはarticle-container/articleの下を見てください。
各グループの合計は、各FF&Eリストの後に印刷され、サブグループを持つグループの合計も、各サブグループの後に印刷される。
これを行うために、2つの条件付きセクションがあります。最初のものは、各リストの後に合計を印刷し、サブグループがない場合にのみ実行します。この条件は次のとおりです:
not(level) |
---|
サブ・グループを持つすべてのグループの合計を得るには、最後のサブ・グループの最後でこれを行う必要があります。これを行うには、以下の条件を使用します:
not(following-sibling::level) and parent::level |
---|
これは最後のレベルであり、親レベルがあることを保証します。