条件付き書式の使用

条件付き書式設定は、特定の条件を満たした場合のみ書式設定要素を表示する場合に指定します。

ノート:

Template Builderを使用して条件付きリージョンおよび条件付き書式を挿入する方法の詳細は、条件付きリージョンの挿入と編集および条件付き書式の挿入を参照してください。

単純な"if"文とより複雑な"choose"式を使用できます。

指定できる条件付き書式設定はXSLまたはXSL:FOコードで、実際のRTFオブジェクト(表やデータなど)を指定することもできます。たとえば、レポートされた数値が特定のしきい値に達した場合に赤で網かけ表示するように指定できます。また、この機能を使用すると、受信したXMLデータに基づいて表の列や行を非表示にすることもできます。

この項では、次のトピックで条件付き書式設定について説明します。

If文の使用

if文を使用すると、単純な条件を定義できます(たとえば、データ・フィールドが特定の値かどうか)。

If文を指定するには:

  1. 次の構文を挿入して、条件領域の開始を指定します。

    <?if:condition?>

  2. 構文<?end if?>を条件領域の最後に挿入します。

たとえば、仕入先名が「Company A」の場合のみ請求書を表示するようにPayables Invoice Registerを設定するには、テンプレートの「Supplier」フィールドの前に、構文<?if:VENDOR_NAME='COMPANY A'?>を挿入します。

請求書表の後に<?end if?>タグを入力します。

次の図にこの例を示します。構文は、フォーム・フィールドに挿入するか、またはテンプレートに直接挿入できることに注意してください。

ボイラープレート・テキストでのIf文の使用

If文を使用して、ユーザーに表示されるメッセージを変更できます。

次の自由書式テキストにIF文を組み込むとします。

The program was (not) successful.

<SUCCESS>というXMLタグの値が「N」の場合のみ、「not」を表示する必要があるとします。

この要件を満たすには、Publisherのコンテキスト・コマンドを使用して、ブロック(デフォルトの配置)ではなくインライン・シーケンスにif文を配置します。

コンテキスト・コマンドを使用した命令の配置の制御を参照してください。

たとえば、次のコードを作成したとします。

The program was <?if:SUCCESS='N'?>not<?end if?> successful.

次の例では望ましくない結果が発生します。

The program was
not
successful.

これは、Publisherでは、デフォルトでブロックに対して命令が適用されるためです。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」の場合の結果です。

ノート:

@inlinesif構文で使用する場合、同じ文中のその他のif構文すべてで、コンテキスト・コマンド@inlineを使用する必要があります。@inlinesFOR-EACH構文で使用する場合、この文中にあるその他のifFOR-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

次の構文を使用してif-then-else文をRTFテンプレートに作成します。

<?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およびotherwiseの各要素を使用して、複数の条件判断を表現します。受信した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>

<?end when?>EXEMPT_FLAGテストを終了します。

<When POSTED_FLAG='*'

<?when:POSTED_FLAG='*'?>POSTED_FLAG要素をテストして、trueの場合は、次の表を使用します。

End When>

<?end when?>POSTED_FLAGテストを終了します。

Otherwise

<?otherwise:?>前述のいずれもtrueでない場合は、次の表を使用します。

End Otherwise>

<?end otherwise?>otherwise文を終了します。

End Choose>

<?end choose?>choose文を終了します。

End 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とマークされています。これは、このリストがPRIVATEリストではなく、パブリック・リストであることを示しています。パブリック・バージョンのリストの場合、数量列は出力に表示されませんが、ここでは、リスト・タイプに基づいて、1つで両方のバージョンに使用可能なテンプレートを開発します。

次の図に、条件に基づいて数量列を表示または非表示にする単純なテンプレートを示します。

次の表は、前述の図に示されたテンプレートへの入力を示しています。

デフォルト・テキスト フォーム・フィールド入力 説明

grp:Item

<?for-each:item?>

item要素の開始のfor-eachループを保持します。

Plasma TV

<?name?>

XMLファイルからのname要素のプレースホルダ。

IF

<?if@column: /items/@type="PRIVATE"?>

列ヘッダーの属性値PRIVATEのテストに対するif文の開始。この構文ではXPath式を使用してXMLのitemレベルに戻り属性をテストします。テンプレートでのXPathの使用については、XPathコマンドの使用を参照してください。

Quantity

なし

ボイラープレート・ヘッダー

end-if

<?end if?>

if文を終了します。

IF

<?if@cell:/items/@type="PRIVATE"?>

列データの属性値PRIVATEをテストするためのif文の開始。

20

<?quantity?>

quantity要素のプレースホルダ。

end-if

<?end if?>

if文を終了します。

1,000.00

<?price?>

price要素のプレースホルダ。

end grp

<?end for-each?>

for-eachループの終了タグ。

条件列の構文は、@column句が追加されたif文です。この@column句によって、if文の結果に基づいて列を表示または非表示にします。

@columnを組み込まなかった場合、データはif文の結果としてレポートに表示されませんが、列は表示されます。これは、テンプレートに列が描画されているためです。

ノート:

@column句はコンテキスト・コマンドの例です。詳細は、コンテキスト・コマンドを使用した命令の配置の制御を参照してください。

この例をレンダリングすると、次の図のような出力が得られます。

同じXMLデータでtype属性がPRIVATEに設定されている場合は、同じテンプレートから次の図に示す出力がレンダリングされます。

行の書式設定

書式設定条件は、表の行レベルで指定できます。

次に、行レベルの書式設定の例を示します。

  • データが特定のしきい値に達したときに行を強調表示します。

  • レポートを読みやすくするために、行の背景色を変更します。

  • 特定の条件を満たした行のみを表示します。

条件に基づく行の表示

特定の条件を満たした行のみを表示するには、グループのfor-eachタグ内で、行の最初と最後に<?if:condition?> <?end if?>タグを挿入します。これらのタグを、次の図に示すテンプレート例で説明します。

次の表は、前述の図のテンプレートで使用されているフィールドを示しています。

デフォルト・テキスト入力 フォーム・フィールドのヘルプ・テキスト 説明

for-each SALE

<?for-each:SALE?>

for-eachループを開始して、SALEグループに属するデータを繰り返します。

if big

<?if:SALES>5000?>

SALES要素の値が5000を超えた場合のみ行を表示するif文。

INDUSTRY

<?INDUSTRY?>

データ・フィールド

YEAR

<?YEAR?>

データ・フィールド

MONTH

<?MONTH?>

データ・フィールド

SALES end if

<?end if?>

if文を終了します。

end SALE

<?end for-each?>

SALEループを終了します。

条件に基づく行の強調表示

この例では、1行おきに背景色を設定する方法を示します。次の図に、この効果を作成するテンプレートを示します。

次の表は、前述の図のテンプレートで使用されているフォーム・フィールドの値を示しています。

デフォルト・テキスト入力 フォーム・フィールドのヘルプ・テキスト 説明

for-each SALE

<?for-each:SALE?>

SALEグループのfor-eachループの開始を定義します。

format;

<?if@row:position() mod 2=0?> <xsl:attribute name="background-color" xdofo:ctx="incontext">lightgray</xsl:attribute><?end if?>

1行おきに、行のbackground color属性をgray(灰色)に設定します。

INDUSTRY

<?INDUSTRY?>

データ・フィールド

YEAR

<?YEAR?>

データ・フィールド

MONTH

<?MONTH?>

データ・フィールド

SALES

<?SALES?>

データ・フィールド

end SALE

<?end for-each?>

SALEのfor-eachループを終了します。

前述の表のformat;フィールドに注目してください。このフィールドには、のコンテキスト(@row)を設定したif文が含まれています。これによって、現在行に適用するif文のコンテキストが設定されます。条件がtrueの場合、行の背景色の<xsl:attribute>はlight gray(淡い灰色)に設定されます。この設定の結果、次の図のような出力が得られます。

コンテキスト・コマンドを使用した命令の配置の制御を参照してください。

セルの強調表示

この例では、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:account?>

account要素のfor-eachループを開始します。

1-232-4444

<?number?>

XMLファイルからのnumber要素のプレースホルダ。

CH1

<?if:debit>1000?><xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute><?end if?>

このフィールドには、借方金額が1000を超えた場合にセルを赤で強調表示するコードが保持されます。

100.00

<?debit?>

debit要素のプレースホルダ。

重要:

<?debit?>要素は、自身のフィールドに存在する必要があります。

CH2

<?if:credit>1000?><xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute><?end if?>

このフィールドには、貸方金額が1000を超えた場合にセルを赤で強調表示するコードが保持されます。

100.00

<?credit?>

credit要素のプレースホルダ。

EFE

<?end for-each?>

for-eachループを終了します。

この表に示すように、貸方列を強調表示するコードは次のとおりです。

<?if:debit>1000?>
  <xsl:attribute 
   xdofo:ctx="block" name="background-color">red
  </xsl:attribute>
<?end if?>

このif文は、debitの値が1000を超えているかどうかをテストし、その場合は次の行が呼び出されます。この例では、if文内にXSL固有のコードが埋め込まれていることに注目してください。

XSLのプロパティは、attribute要素を使用して変更できます。

xdofo:ctxコンポーネントを使用すると、テンプレート内のすべてのレベルでXSL属性を調整できます。この例の場合は、background color属性がred(赤)に変更されています。

color属性の変更には、標準的なHTMLの名称(赤、白、緑など)か、16進数の色定義(#FFFFFなど)を使用できます。

このテンプレートにより、次の図のような出力が得られます。