条件付きレイヤー
レイヤーは多数のマッピングのリンクを見やすくするために使いますが、ある特定の条件のときだけマッピングするように定義することもできます。条件を定義したレイヤーを「条件付きレイヤー」といいます。条件付きレイヤーとしてレイヤーを使う場合、レイヤーの追加時に条件式を指定します。条件を設定したレイヤーは、マッピングウィンドウ下部のレイヤー名タブの色が変わります。
- 関連項目
マッピングと条件の評価の順序
複数のレイヤーを追加して条件なしレイヤーと条件付きレイヤーが混在する場合、レイヤーの配置に関わらず、必ず先に条件なしレイヤーのマッピング行われます。複数の条件なしレイヤーは1つのレイヤーとして認識されてマッピングが行われます。その次に、条件付きレイヤーのマッピングがレイヤータブの左から順に行われます。複数の条件付きレイヤーで同じフィールドへのマッピングがある場合、条件が真になったときのマッピングで上書きされていき、一番最後のマッピングが有効になります。条件付きレイヤーのマッピングが順次行われている途中でエラーが発生した場合、それまでのマッピングは有効です。
1つの条件付きレイヤーの中で行ごとに条件を評価している場合、かつAND、ORを使って複数の条件を記述している場合、行ごとに条件が真になったときのマッピングで上書きされていき、一番最後のマッピングが有効になります。たとえば、レコードの一番目のフィールドの値を判定してマッピングを行うときの条件式を「record.field1 = 2 || record.field1 = 4」とした場合、条件が複数、真になったときは1つの条件付きレイヤーの中でも複数回マッピングが行われて上書きされていきます。
条件式
条件式を使って、入力ストリームや各種変数を判定することができます。
比較演算子、値
比較演算子としては以下のものが使用できます。右辺には文字列、数値、変数のいずれかが指定できます。
= | 等価 |
---|---|
!= | 等価ではない |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
~= | を含む (※右辺が文字列の場合のみ) |
- 文字列の大小比較は辞書順で比較します。
- 「~=」の右辺に文字列以外の型を指定した場合は結果は常にFalseになります。
条件式の結果
結果はtrueまたはfalseのどちらかになります。条件式に誤りがある場合はエラーとなります。また、式でなく「True」「False」の文字列を直接記述して分岐することもできます。
入力ストリームの判定
ストリームを判定する条件式の記述には、以下の2種類の記述方法のいずれかを使用します。RQLは本製品独自の記述方法です。XPathはW3C勧告のXPath仕様に準拠しています。式の種類を特定するためのプレフィクスを式の前に記述します。プレフィクスは省略可能で、省略した場合はストリーム型がXMLの場合はXPath、それ以外の場合はRQLで記述されたものとします。
条件式の種類 | 説明 | プレフィクス | 評価対象のストリーム型 |
---|---|---|---|
RQL | レコード形式を評価 | record: | すべてのストリーム型 |
XPath | XML形式を評価 | xpath: | XML |
メモ
条件付きレイヤーの評価対象としてMIMEを判定することはできません。
Binary形式の以下のデータは、これらの条件式で判定できません。Binary型の比較を行う場合はマッパー関数の論理タブの関数群を使用してください。
- ストリーム型がBinaryの場合
- 各ストリームの中に含まれるフィールドのデータ型がBinaryの場合
- 各種変数のデータ型がBinaryの場合
またXMLをレコード形式で評価する場合、マッピングに使用されていない繰り返し要素以下のフィールドは評価対象となりません。
各種変数の判定
フロー変数やセッション変数などの変数を判定する場合、以下のようなリファレンス表記で変数やプロパティを参照することができます。
変数の種類 | リファレンス表記 |
---|---|
フロー変数 | $flow.<フロー変数名> |
外部変数セット | $exvar.<外部変数セット名>.<変数名> |
システム変数 | $system.<システム変数名>(英語名) |
ストリーム変数 | $stream.<ストリーム変数名>(英語名) |
マッパー変数 | $local.<ローカル変数名> |
直前のコンポーネントのプロパティ | $prev.<プロパティ名>(英語名) |
「$」または「.」を入力した時にはコード補完のリストが表示されその中から変数を選択することができます。
特にコンポーネントプロパティではプロパティ名は表示名(インスペクタで表示される日本語のプロパティ名)ではなく実名(プログラム上の名前)で参照されるので入力にはコード補完を利用してください。
注意
条件式でbool値(true/false)と比較する場合、入力ストリーム型がXMLのときには注意が必要です。詳しくは、下記「XPath」の「bool値との比較」を参照してください。
RQL
RQLはレコードに対して条件式を記述するための言語です。レコードの各フィールドにはフィールド名またはフィールドインデックスによってアクセスします。インデックスは0ベースです。インデックスのアクセスではワイルドカード(*)でのアクセスが可能です。ワイルドカードが指定された場合、レコードいずれかのフィールドが条件を満たした場合、結果はTrueとなります。
フィールド名による指定の例
$record.field1 = "aaa" $record.field2 < 3
フィールドインデックスによる指定の例
$record[0] = "aaa" $record[1] < 3 $record[*] = "bbb"
ストリーム型がText、HTML、MIMEに対するRQLの適用
これらのストリームは「Object」という名前の単一フィールドをもつ単一レコードとして扱われます。つまり、以下のような式を記述できます。
$record.Object="aaa"
XPath
XPathはW3C勧告のXPath仕様に準拠しています。
XPathによる指定の例
/root/element[@attr='test'] /root/element >= 10 /root/element != 'test'
XPathでの評価
XPathで記述した条件式の評価は、XML全体に対して行われます。繰り返しがある要素やその属性に対して評価を行う場合、繰り返しの中で1つでも条件が真であるとその要素ではなくXML全体が真であるとしてマッピングされます。繰り返しがある要素に対して1つ1つ評価を行うには、繰り返しをレコードとして評価するためにRQLを使います。例を以下に示します。
<root> <element id="1"> <data>aaa</data> </element> <element id="2"> <data>bbb</data> </element> <element id="3"> <data>ccc</data> </element> </root> [ 上記のようなXMLに対しての条件式の例 ] record:$record./root/element/@id = 2
bool値との比較
入力ストリーム型がXMLの場合に条件式でbool値(true/false)と比較したいときは、明示的にRQL で比較するようにプレフィクスを記述します。例えば条件式が「$local.var1 = true」の場合、「record:$flow.var1 = true」のように記述します。 これは、評価対象のストリーム型がXMLの場合は条件式の種類をXPathとして処理しますが、「$local.var1 = true」のような条件式もXPathとして処理され、コンテキストノードに「true」という要素があるかないかの結果を$local.var1と比較すると解釈されるためです。
AND, ORの使用
- RQLでは「&&」「||」を使用することによって条件式を連結することができます。
- XPathでは「and」「or」を使用します。(これはXPathの仕様です。)
使用例
フロー変数の場合
$flow.var1 > 5
外部変数セットの場合
$exvar.exvar1.var1 = "MATCH"
変数自身を判定する以外に、入力ストリームを判定する条件式の中でも変数を参照できます。
RQLの場合
$record.field1 != $flow.var1
XPathの場合
/root/element1[@attr1=$exvar.exvar1.var1]
マッパー変数の場合
record.field1 = $local.var1