データの処理
これらのセクションでは、テンプレート内のデータを処理するメソッドについて説明します。
データのソート
グループ内の任意の要素でグループをソートできます。 グループ・タグ内に次の構文を挿入します:
<?sort:element name; order; data-type?>
where
element nameは、グループをソートする要素の名前です
順序は'昇順'または'降順'です
data-typeは、要素のデータ型です。 有効な値は次のとおりです: 'text'および'number'。
順序が指定されていない場合、デフォルトでは、ソート順序は昇順です。 データ型が指定されていない場合、型はテキストとみなされます。
たとえば、最も高い給与が最初に表示されるように、データセットをSALARYという名前のエレメントでソートするには、次のように入力します:
<?sort:SALARY;'descending';'number'?>
for-eachグループ内でソートする場合は、for-each文の後にソート文を入力します。 たとえば、買掛/未払金請求書台帳(この章の最初に表示)をサプライヤ(VENDOR_NAME)でソートするには、次のように入力します:
<?for-each:G_VENDOR_NAME?><?sort:VENDOR_NAME?>
グループを複数のフィールドでソートするには、適切な順序で追加のソート文を入力します。 たとえば、サプライヤでソートしてから請求書番号でソートするには、次のように入力
<?sort:VENDOR_NAME?> <?sort:INVOICE_NUM;'ascending';'number'?>
Null値のチェック
XMLデータ内には、エレメントの値の3つのシナリオが考えられます。
シナリオ:
-
要素はXMLデータに存在し、値があります。
-
要素はXMLデータに存在しますが、値がありません。
-
XMLデータに要素がないため、値がありません。
レポート・レイアウトでは、要素の存在とその値に応じて異なる動作を指定できます。 次の例は、"if"文を使用してこれらの各条件を確認する方法を示しています。 構文は、他の条件付き書式設定構成でも使用できます。
-
要素が存在し、値がnullでない場合の動作を定義するには、次を使用します:
<?if:element_name!=' '?> 「望ましい動作」 <?end if?>
-
要素が存在するがnullの場合の動作を定義するには、次を使用します:
<?if:element_name and element_name="?> 「望ましい動作」 <?end if?>
-
要素が欠落している場合の動作を定義するには、次を使用します:
<?if:not(element_name) ?> 「望ましい動作」 <?end if?>
XMLデータの再グループ化
RTFテンプレートでは、元のデータに存在しない階層にXMLデータを再グループ化できるXSL 2.0 for-each-group標準がサポートされています。
この機能を使用すると、テンプレートはソースXMLファイルの階層に従う必要はありません。 したがって、データ・ソースの構造によって制限されなくなります。
XMLサンプル
このXMLサンプルは、for-each-group標準を使用するデータのセットを示しています。
for-each-group標準を示すために、CDカタログ一覧の次のXMLデータ・サンプルがテンプレートに再グループ化されます:
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide Your Heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary More</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin Records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>This is US</TITLE>
<ARTIST>Gary Lee</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin Records</COMPANY>
<PRICE>12.20</PRICE>
<YEAR>1990</YEAR>
</CD>
再グループ化構文を使用して、CDを国別、さらに年別にグループ化するこのデータのレポートを作成できます。 表示されたデータ構造によって制限されることはありません。
構文の再グループ化
適切な構文を使用してデータを再グループ化できます
データを再グループ化するには、次の構文を使用します:
<?for-each-group: BASE-GROUP;GROUPING-ELEMENT?>
たとえば、CDリストをCOUNTRYで再グループ化するには、テンプレートに次のように入力します:
<?for-each-group:CD;COUNTRY?>
COUNTRYと同じ階層レベルの要素がCOUNTRYの子になります。 その後、グループの要素を参照して、必要な値を表示できます。
すでに定義されているグループ内にネストされたグループ化を確立するには、次の構文を使用します:
<?for-each:current-group(); GROUPING-ELEMENT?>
たとえば、COUNTRYでCDグループ化を宣言した後、COUNTRY内のYEARでさらにグループ化できます:
<?for-each:current-group();YEAR?>
実行時に、「パブリッシャ」は新しいグループ化の出現をループし、テンプレートで定義したフィールドを表示します。
ノート:
この構文は、単純なXSL for-each-group構文です。 前述の簡略化された構文を使用しない場合は、次のようにXSL構文を使用できます。 XSL構文は、テンプレートのフォーム・フィールド内でのみ使用できます。<xsl:for-each-group
select=expression
group-by="string expression"
group-adjacent="string expression"
group-starting-with=pattern>
<!--Content: (xsl:sort*, content-constructor) -->
</xsl:for-each-group>
テンプレートの例
この例では、テンプレートを拡張するために使用できるいくつかの機能を確認できます。
次の図は、CDを国、年、および各CDの詳細を表示するテンプレートを示しています。
次の表に、前の図に示したテンプレートのフォーム・フィールドで行われた「パブリッシャ」構文エントリを示します。
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト入力 | 説明 |
---|---|---|
国別グループ |
|
|
USA |
|
COUNTRYタグのデータ値を表示するプレースホルダー。 |
年別グループ |
|
|
2000 |
|
YEARタグのデータ値を表示するプレースホルダー。 |
グループ: 詳細 |
|
データがCOUNTRY、YEARの順にグループ化されると、 |
自分のCD |
|
TITLEタグのデータ値を表示するプレースホルダー。 |
John Doe |
|
ARTISTタグのデータ値を表示するプレースホルダー。 |
1.00 |
|
PRICEタグのデータ値を表示するプレースホルダー。 |
終了グループ |
|
|
年別グループ終了 |
|
|
国別終了グループ |
|
|
このテンプレートは、XMLファイルとのマージ時に次の図に示すレポートを生成します。
式による再グループ化
式で再グループ化すると、関数またはコマンドをデータ要素に適用し、返された結果でデータをグループ化できます。
この機能を使用するには、再グループ化構文内で式を次のように記述します:
<?for-each:BASE-GROUP;GROUPING-EXPRESSION?>
この機能をデモンストレーションするために、1か月当たりの平均温度のみを含むXMLデータ・サンプルが、特定の範囲内の平均温度を持つ月数を計算するテンプレートへの入力として使用されます。
次のXMLコードは、<temp>グループで構成されます。 各<temp>グループには、その月の平均温度を含む<month>要素と<degree>要素が含まれます:
<temps>
<temp>
<month>Jan</month>
<degree>11</degree>
</temp>
<temp>
<month>Feb</month>
<degree>14</degree>
</temp>
<temp>
<month>Mar</month>
<degree>16</degree>
</temp>
<temp>
<month>Apr</month>
<degree>20</degree>
</temp>
<temp>
<month>May</month>
<degree>31</degree>
</temp>
<temp>
<month>Jun</month>
<degree>34</degree>
</temp>
<temp>
<month>Jul</month>
<degree>39</degree>
</temp>
<temp>
<month>Aug</month>
<degree>38</degree>
</temp>
<temp>
<month>Sep</month>
<degree>24</degree>
</temp>
<temp>
<month>Oct</month>
<degree>28</degree>
</temp>
<temp>
<month>Nov</month>
<degree>18</degree>
</temp>
<temp>
<month>Dec</month>
<degree>8</degree>
</temp>
</temps>
次の図に示すように、このデータを温度範囲を示す形式で表示し、それらの範囲を満たす平均温度がある月の数を表示するとします。
for-each-groupコマンドを使用して、温度を10度ずつグループ化できる式を<degree>要素に適用できます。 次に、各グループのメンバーの数(各範囲内の平均温度を持つ月数)を表示できます。
次の図は、前の図に示したレポートを作成するためのテンプレートを示しています。
次の表は、前の図に示したテンプレートで行われたフォーム・フィールド・エントリを示しています。
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト入力 |
---|---|
TmpRngでグループ化 |
<?for-each-group:temp;floor(degree div 10)?> <?sort:floor(degree div 10)?> |
次の範囲 |
<?concat(floor(degree div 10)*10,' F to ',floor(degree div 10)*10+10, 'F')?> |
月数 |
<?count(current-group())?> |
終了TmpRng |
<?end for-each-group?> |
フォーム・フィールドのタグについては、次の点に注意してください:
-
<?for-each-group:temp;floor(degree div 10)?>は、再グループ化タグです。 既存の<temp>グループの場合、要素は式floor(degree div 10)によって再グループ化されることを指定します。 floor関数は、引数より小さい最大整数を返すXSL関数です(たとえば、1.2は1を返し、0.8は0を返します)。
この場合、<degree>要素の値が10で除算されます。 これにより、XMLデータから次の値が生成されます: 1、1、1、2、3、3、3、3、3、2、2、1、および0。
これらはソートされるため、処理時に次の4つのグループが作成されます: 0、1、2、および3。
-
<?concat(floor(degree div 10)*10,'F to ', floor(degree div 10)*10+10,'F'?>は、行ヘッダーの温度範囲を10単位で表示します。 式は、現在のグループの値に10を掛け、現在のグループの値に10 + 10を掛けた値を連結します。
したがって、最初のグループ0の場合、行見出しは0から(0 +10)、または0から10 Fと表示されます。
-
<?count(current-group())?>は、count関数を使用して、現在のグループのメンバー(範囲を満たす温度の数)をカウントします。
-
<?end for-each-group?>タグはグループ化を閉じます。