Nil の値 / Nillable

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  データソースとターゲット > XML と XML スキーマ >

Nil の値 / Nillable

XML スキーマ仕様に従えば、nillable="true" 属性をスキーマ内の要素に対して指定することで、(コンテンツのデータ型により空のコンテンツが許されていない場合でも)コンテンツを含まない要素でも妥当とみなすことができるようになります。XML インスタンスドキュメント内に記述される属性の xsi:nil="true" により、要素は存在するが、コンテンツは含まれない(つまり空要素である)ことが示されます。このセクションはどのように、 MapForce がソースとターゲットコンポーネント内の nil 要素を扱うかを説明します。

 

'xsi:nil' と 'nillable' の比較

xsi:nil="true" 属性は XML インスタンスファイルにおいてのみ定義されます。

 

nill2

 

xsi:nil 属性は MapForce のマッピングにて視覚的(かつ明示的)に示されることは無く、自動的に処理されます。通常、null 値が許容されたノード(xsi:nil="true" 属性が含まれるノード)は存在するが、コンテンツには何も含まれない状態になります。

 

xsi:nil 属性は、通常自動的に処理されるため、MapForce グラフィカルなマッピングで明示的に表示されません。 特に "nilled" ノード ( xsi:nil="true" 属性を持つ) が存在する場合、そのコンテンツは存在しません。

 

nillable="true" 属性は、 XML スキーマ 内で定義されます。MapForce では、ソースとターゲットコンポーネント内に存在することができます。

 

nill1

 

マッピングソースにある null 値が許容された要素

マッピングにて null 値を許容する(nillable な)データを XML 要素から読み取った場合、xsi:nil 属性が自動的にチェックされます。xsi:nil の値が true となっている場合、コンテンツは存在しないものとして扱われます。

 

nillable なソース要素から単純コンテンツの(属性は含まれるが子要素を含まない) nillable なターゲット要素に対して、ターゲット優先マッピングでマッピングを作成し、xsi:nil がソース要素にセットされている場合、xsi:nil 属性がターゲット要素にも挿入されます (例: <OrderID xsi:nil="true"/>)。

 

全てコピーマッピングを nillable なソース要素から nillable なターゲット要素へマッピングして、xsi:nil がソース要素にてセットされている場合、xsi:nil 属性がターゲット要素にも挿入されます (例: <OrderID xsi:nil="true"/>)。

 

ソース要素の xsi:nil に true がセットされているかを明示的にチェックするには、 is-xsi-nil 関数を使用します。「nil 化」された要素に対して true が返され、それ以外のノードに対して false が返されます。

 

nil 化された(存在しない)ソース要素の値を別の値で代用するには、substitute-missing 関数を使用してください。

 

メモ:

コンテンツが無くても要素ノードが実際存在するため、exists 関数を nill 化されたソース要素 に接続すると、 TRUE を返します。
xsi:nil が設定されている箇所で( multiplyconcat などの) 単純型の値を期待する関数を要素に対して使用すると、要素コンテンツが存在しなく、結果を取得することはできません。 これらの関数はソースノードが存在しないかのように振舞います。

 

マッピングターゲットとしての Nillable 要素

nillable なソース要素から単純コンテンツの(属性は含まれるが子要素を含まない) nillable なターゲット要素に対して、ターゲット優先マッピングでマッピングを作成し、xsi:nil がソース要素にセットされている場合、xsi:nil 属性がターゲット要素にも挿入されます(例: <OrderID xsi:nil="true"/>)。 xsi:nil="true" 属性が XML ソース要素にセットされていない場合、通常の方法で要素コンテンツがターゲット要素へマッピングされます。

 

マッピングが(子要素を持つ)複合型の nillable 要素に対して行われている場合、xsi:nil 属性が自動的に書き込まれることはありません。これはマッピングが行われた後で子要素が書き込まれるか分からない為です。全てコピー接続を定義することで、ソース要素から xsi:nil 属性をコピーすることができます。

 

空のシーケンスまたはデータベースの NULL 値をターゲット要素へマッピングする場合、それが nillable であるかどうかにかかわらず、要素が作成されることはありません。

 

空のターゲット要素を xsi:nil="true" 属性がセットされた状態で(強制的に)作成するには、 set-xsi-nil 関数をターゲット要素へ直接接続してください。この方法は単純型ならびに複合型のターゲット要素に対して使用することができます。

 

substitute-missing-with-xsi-nil 関数を使用することで、マッピングソースから値を得ることができない場合に xsi:nil をターゲットへ挿入することができます。これはソースノードが全く存在しない場合、または(multiply のような)計算に対して nil 化されたソースノードが与えられ、結果が得られなかった場合などに使用することができます。

 

この関数はデータベースの NULL 値から xsi:nil="true" を持つ要素を作成するのに使用することができます。この関数は単純型のコンテンツを持つノードに対してのみ使用することができます。

 

 

メモ:

xsi:nil を生成する関数は、(if-else 関数などの )値に対して動作する関数またはコンポーネントにパススルーされることはできません。

 

 

NULL データベースフィールドから xsi:nil へマッピング

NULL データベースフィールドが XML スキーマの nillable 要素へマッピングされた場合、実際にデータを含んでいるフィールドに対応したターゲット要素だけが生成されます。NULL データベースフィールドの要素はターゲットコンポーネントにて作成されません。

 

ターゲットコンポーネント内ですべての要素の作成を強制するには、アライブラリのノード関数から substitute-missing-with-xsi-nil 関数を使用します。

nill4

 

上のスクリーンショットは、 どのように substitute-missing-with-xsi-nil 関数が全てのデータベースフィールドのためにターゲット要素を作成するかを示しています:

 

ターゲット要素内で <OrderID xsi:nil="true"/> を含むすべての 不足している/NULL データベースフィールド
データベースフィールドがターゲット要素に直接マップされる既存のデータ例: <OrderID>1</OrderID>.

 

データベースコンポーネントの Null フィールドを確認するには、データベース クエリ ボタンをクリックして、 データベース テーブルに対してクエリを実行します。Null フィールドは「結果」 ウィンドウ内で 「NULL」 と表示されます。

nill3

 

xsi:nil を NULL データベースフィールドにマップする

nill 化された XML 要素をデータベース列にマップするには、 MapForce は NULL 値をデータベースに書き込みます。set-null 関数を使用して、データベースフィールドを NULL に無条件で設定することもできます。


(C) 2019 Altova GmbH