条件付き書式設定の使用
条件付き書式設定は、特定の条件が満たされた場合にのみ書式設定要素が表示される場合に発生します。
ノート:
Template Builderを使用して条件付きリージョンおよび条件付き書式設定を挿入する方法の詳細は、「条件付きリージョンの挿入および編集」および「条件付き書式設定の挿入」を参照してください。単純な"if"文とより複雑な"choose"式を使用できます。
指定する条件付き書式は、XSLまたはXSL:FOコードにすることも、表やデータなどの実際のRTFオブジェクトを指定することもできます。 たとえば、レポートされた数値が特定のしきい値に達した場合に赤で陰影で表示されるように指定できます。 または、この機能を使用して、受信XMLデータに応じて表の列または行を非表示にできます。
この項では、条件付き書式設定の次のトピックについて説明します:
If文の使用
if文を使用して単純な条件を定義します。たとえば、データ・フィールドが特定の値の場合です。
if文を使用するには:
たとえば、サプライヤ名が「会社A」の場合にのみ請求書が表示されるように買掛/未払金請求書台帳を設定するには、テンプレートの「サプライヤ」フィールドの前に構文<?if:VENDOR_NAME='COMPANY A'?>を挿入します。
請求書表の後に<?end if?>タグを入力します。
この例は、次の図に表示されます。 構文は、フォーム・フィールドに挿入することも、テンプレートに直接挿入することもできます。
ボイラープレート・テキストでのIf文の使用
"if"文を使用して、ユーザーに表示されるメッセージを変更できます。
次のフリー・フォーム・テキストにif文を組み込むとします:
The program was (not) successful.
<SUCCESS>
というXMLタグの値が「N」の場合にのみ表示しないようにします。
この要件を実現するには、「パブリッシャ」コンテキスト・コマンドを使用して、if文をブロック(デフォルトの配置)ではなくインライン順序に配置します。
「コンテキスト・コマンドを使用した命令の配置の制御」を参照してください。
たとえば、コードを次のように作成するとします:
The program was <?if:SUCCESS='N'?>not<?end if?> successful.
次の望ましくない結果が発生します:
The program was
not
successful.
「パブリッシャ」は、デフォルトで命令をブロックに適用するためです。 if文をインライン順序に挿入するように指定するには、次のように入力します:
The program was <?if@inlines:SUCCESS='N'?>not<?end if?>
successful.
この構成では、次の表示になります:
The program was successful.
SUCCESSが'N'と等しくない場合
または
The program was not successful.
SUCCESSがNの場合。
ノート:
@inlines
をif
構文とともに使用する場合は、文内の他のif
構文でコンテキスト・コマンド@inline
を使用する必要があります。FOR-EACH
構文で@inlines
を使用する場合、文内の他のif
またはFOR-EACH
構文では、コンテキスト・コマンド@inline
を使用する必要があります。
If-Then-Else文の使用
プログラミング構造if-then-elseを使用できます。
"if-then-else"は、条件をテストして条件付きで結果を表示する必要がある場合に非常に役立ちます。 たとえば:
IF X=0 THEN
Y=2
ELSE
Y=3
END IF
これらの文を次のようにネストすることもできます:
IF X=0 THEN
Y=2
ELSE
IF X=1 THEN
Y=10
ELSE Y=100
END IF
次の構文を使用して、RTFテンプレートにif-then-else文を作成します:
<?xdofx:if element_condition then result1 else result2 end if?>
たとえば、次の文はAMOUNT要素値をテストします。 値が1000より大きい場合は、「Higher」と表示し、1000未満の場合は「Lower」、1000の場合は「Equal」と表示します:
<?xdofx:if AMOUNT > 1000 then 'Higher'
else
if AMOUNT < 1000 then 'Lower'
else
'Equal'
end if?>
Choose文の挿入
複数の条件付きテストを表現するには、choose、when、その他要素を使用します。 受信XMLデータで特定の条件が満たされると、テンプレートの特定のセクションがレンダリングされます。 これは、RTFテンプレートの非常に強力な機能です。 通常のXSLプログラミングでは、chooseコマンドで条件が満たされると、XSLコードがさらに実行されます。 ただし、テンプレートでは、条件フロー(次の例の表)でビジュアル・ウィジェットを実際に使用できます。
これらの要素には、次の構文を使用します:
<?choose:?>
<?when:expression?>
<?otherwise?>
条件付きフォーマットの例
この例は、データ行の表示がフィールドEXEMPT_FLAGおよびPOSTED_FLAGの値に依存するchoose
式を示しています。 EXEMPT_FLAGが"^"の場合、データ行はライト・グレーでレンダリングされます。 POSTED_FLAGが"*"の場合、データ行は影付きの濃いグレーでレンダリングされます。 それ以外の場合、データ行はシェーディングなしでレンダリングされます。
次の図では、フォーム・フィールドのデフォルト・テキストが表示されています。 次の表に、フォーム・フィールドのヘルプ・テキスト・エントリを示します:
サンプル・フォーム・フィールドのデフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト入力 |
---|---|
<Grp:VAT |
<?for-each:G_VAT?>は、G_VATグループを起動 |
<Choose |
<?choose:?>はchoose文を開きます |
<When EXEMPT_FLAG='^' |
<?when: EXEMPT_FLAG='^'?>はEXEMPT_FLAG要素をテストし、trueの場合は、次に示す最初の表を使用 |
次の場合に終了> |
<?end when?>はEXEMPT_FLAGテストを終了 |
<When POSTED_FLAG='*' |
<?when:POSTED_FLAG='*'?>はPOSTED_FLAG要素をテストし、trueの場合は次の表を使用 |
次の場合に終了> |
<?end when?>はPOSTED_FLAGテストを終了 |
その他 |
<?otherwise:?>前述のいずれもtrueでない場合は、次の表を使用 |
その他終了> |
<?end otherwise?>は、他の文を終了 |
選択の終了> |
<?end choose?>はchoose文を終了 |
終了VAT> |
<?end for-each?>はG_VATグループを終了 |
列の書式設定
文書出力のデータの列を条件付きで表示および非表示にできます。 この例では、要素属性の値に基づいてのみ列が表示されるように表を設定する方法を示します。
この例は、次のXMLで表される価格表のレポートを示しています:
<items type="PUBLIC"> <! - can be marked 'PRIVATE' - >
<item>
<name>Plasma TV</name>
<quantity>10</quantity>
<price>4000</price>
</item>
<item>
<name>DVD Player</name>
<quantity>3</quantity>
<price>300</price>
</item>
<item>
<name>VCR</name>
<quantity>20</quantity>
<price>200</price>
</item>
<item>
<name>Receiver</name>
<quantity>22</quantity>
<price>350</price>
</item>
</items>
items要素に関連付けられた"type"属性に注意してください。 このXMLでは、"PUBLIC"としてマークされています。つまり、リストはプライベート・リストではなくパブリック・リストです。 公開バージョンのリストでは、数量列は出力に表示されませんが、リスト・タイプに基づいて両方のバージョンに対して1つのテンプレートのみを開発する必要があります。
次の図には、数量列を条件付きで表示または非表示にする単純なテンプレートが含まれています。
次の表に、上の図に示されているテンプレートで行われたエントリを示します:
デフォルト・テキスト | フォーム・フィールド・エントリ | 説明 |
---|---|---|
grp:Item |
|
item要素のfor-eachループのオープンを保持します。 |
Plasma TV |
|
XMLファイルのname要素のプレースホルダー。 |
IF |
|
列ヘッダーの属性値PRIVATEをテストするif文のオープン。 この構文では、XPath式を使用してXMLのアイテム・レベルに戻り、属性をテストすることに注意してください。 テンプレートでのXPathの使用の詳細は、「XPathコマンドの使用」を参照してください。 |
数量 |
該当なし |
ボイラープレート見出し |
end-if |
|
if文を終了します。 |
IF |
|
列データの属性値PRIVATEをテストするif文のオープン。 |
20 |
|
数量要素のプレースホルダー。 |
end-if |
|
if文を終了します。 |
1,000.00 |
|
価格要素のプレースホルダー。 |
end grp |
|
for-eachループの閉じタグ。 |
条件列の構文は、@column句が追加された"if"文の構文です。 if文の結果に基づいて列を非表示または表示するように指示する@column句です。
@columnを含めなかった場合、データはif文の結果としてレポートに表示されませんが、列はまだテンプレートに描画されていたためです。
ノート:
@column句は、コンテキスト・コマンドの例です。 詳細は、「コンテキスト・コマンドを使用した命令の配置の制御」を参照してください。
この例では、次の図に示す出力をレンダリングします:
同じXMLデータにPRIVATEに設定されたtype属性が含まれていた場合、次の図に示す出力は同じテンプレートからレンダリングされます。
行の書式設定
表の行レベルとして書式設定条件を指定できます。
行レベルの書式設定の例を次に示します:
-
データが特定のしきい値に達した場合の行を強調表示します。
-
レポートを読みやすくするために、行のバックグラウンド色を切り替えます。
-
特定の条件を満たす行のみを表示します。
条件による行の表示
特定の条件を満たす行のみを表示するには、グループのfor-eachタグ内で、行の先頭と末尾に<?if:condition?>
<?end if?>
タグを挿入します。 これらのタグは、次の図に示すサンプル・テンプレートで示されています:
次の表では、上の図のテンプレートのフィールドについて説明します:
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト | 説明 |
---|---|---|
for-each SALE |
|
for-eachループを開き、SALEグループに属するデータを繰り返します。 |
if big |
|
要素SALESの値が5000より大きい場合にのみ、行を表示するif文。 |
INDUSTRY |
|
データ・フィールド |
YEAR |
|
データ・フィールド |
MONTH |
|
データ・フィールド |
SALES end if |
|
if文を閉じます。 |
end SALE |
|
SALEループを閉じます。 |
条件による行の強調表示
この例では、他のすべての行にバックグラウンド色を設定する方法を示します。 この効果を作成するテンプレートを次の図に示します:
次の表に、上の図のテンプレートからのフォーム・フィールドの値を示します:
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト | 説明 |
---|---|---|
for-each SALE |
|
SALEグループのfor-eachループの開始を定義します。 |
format; |
|
行のバックグラウンド色属性は、代替行ごとにグレーに設定されます。 |
INDUSTRY |
|
データ・フィールド |
YEAR |
|
データ・フィールド |
MONTH |
|
データ・フィールド |
SALES |
|
データ・フィールド |
end SALE |
|
SALE for-eachループを閉じます。 |
前述の表で、format;フィールドを確認します。 "row"コンテキスト(@row)を持つif文が含まれています。 現在の行に適用するif文のコンテキストを設定します。 条件がtrueの場合、行のバックグラウンド色の<xsl:attribute>
はライト・グレーに設定されます。 この設定の結果、次の図に示す出力が表示されます:
「コンテキスト・コマンドを使用した命令の配置の制御」を参照してください。
セルを強調表示
この例では、XMLファイルの値に基づいてセルを条件付きで強調表示する方法を示します。
この例では、次のXMLコードを使用します:
<accounts>
<account>
<number>1-100-3333</number>
<debit>100</debit>
<credit>300</credit>
</account>
<account>
<number>1-101-3533</number>
<debit>220</debit>
<credit>30</credit>
</account>
<account>
<number>1-130-3343</number>
<debit>240</debit>
<credit>1100</credit>
</account>
<account>
<number>1-153-3033</number>
<debit>3000</debit>
<credit>300</credit>
</account>
</accounts>
テンプレートには、勘定科目とその貸方および借方の値がリストされます。 最終レポートは、値が1000より大きいすべてのセルで赤で強調表示されます。 このテンプレートを次の図に示します:
次の表に、テンプレートのフィールド定義を示します:
デフォルト・テキスト・エントリ | フォーム・フィールド・エントリ | 説明 |
---|---|---|
FE:Account |
|
エレメント勘定科目のfor eachループを開きます。 |
1-232-4444 |
|
XMLファイルの数値要素のプレースホルダー。 |
CH1 |
|
このフィールドには、借方金額が1000を超える場合にセルを赤で強調表示するコードが保持されます。 |
100.00 |
|
借方要素のプレースホルダー。 重要: <?debit?> 要素は、独自のフィールドに存在する必要があります。
|
CH2 |
|
このフィールドには、貸方金額が1000を超える場合にセルを赤で強調表示するコードが保持されます。 |
100.00 |
|
クレジット要素のプレースホルダー。 |
EFE |
|
for-eachループを閉じます。 |
表に示すように、借方列をハイライト表示するコードは次のとおりです:
<?if:debit>1000?>
<xsl:attribute
xdofo:ctx="block" name="background-color">red
</xsl:attribute>
<?end if?>
"if"文は、借方の値が1000より大きいかどうかをテストし、その場合は次の行が呼び出されます。 例では、ネイティブXSLコードがif文内に埋め込まれていることに注意してください。
"attribute"要素を使用すると、XSLのプロパティを変更できます。
xdofo:ctx
コンポーネントを使用すると、テンプレートの任意のレベルでXSL属性を調整できます。 この場合、バックグラウンド色属性が赤に変更されます。
color属性を変更するには、標準のHTML名(赤、白、緑など)を使用するか、16進数の色定義(#FFFFFなど)を使用できます。
このテンプレートの結果、次の図に示す出力が表示されます: