ノード名へのアクセスを取得する

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

ホーム >  マッピングのデザイン > ノード名のマッピング >

ノード名へのアクセスを取得する

XML コンポーネント(または、CSV/FLF コンポーネント内のフィールド) 内のノードに子ノードが存在する場合、マッピングの名前と各子ノードの値をマッピングで直接取得することができます。このテクニックは、「動的なノード名」 へのアクセスと呼ばれます。「動的」 とは、処理がランタイム中に素早く行われることを意味し、マッピングが実行される前に既知の静的なスキーマ情報をベースに行われます。このトピックは、ノード名への動的なアクセスの有効化の方法と、その使用方法について説明します。

 

ソースからデータを読み取る場合、「動的なノード名」 とは以下を行うことができることを意味します:

 

ノードの全ての子ノード(または 属性) のリストをシーケンスとして取得します。 MapForce では、"シーケンス" は、ゼロのリスト、または、ターゲットに接続することのできるアイテムであり、ソース内にアイテムが存在すると、ターゲットに同じ数のアイテムを作成します。ですから、例えば、ノードがソース内に5つの 属性 を持つ場合、ターゲット内に属性に対応する5つの新規の要素を作成します。
(標準マッピングが行う)子ノードの値を読み取るだけではなく、名前も読み込みます。

 

ターゲットにデータを書き込む場合、 「動的なノード名」は、以下を行うことができることを意味します:

 

コンポーネント設定 (いわゆる 「静的」 名前)により与えられた名前とは対照的な、マッピング (いわゆる 「動的」 名前) により与えられる名前を使用して、新しいノードを作成します。

 

動的なノード名を説明するために、このトピックは次の XML スキーマを使用しています: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\Products.xsd。 このスキーマは、サンプルインスタンスドキュメント Products.xml を伴っています。スキーマとインスタンスファイルをマッピングエリアに追加するには、「挿入| XML スキーマ/ファイル」 メニューコマンドを選択して、 <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\Products.xml を参照してください。 ルート要素を選択するように問われると、products を選択します。

 

product ノードのための動的なノード名を有効化するには、右クリックし、 次のコンテキストメニューコマンドの1つを選択します:

 

ノードの 属性にアクセスする場合、「動的な名前を持つ属性を表示」
ノードの子要素にアクセスする場合、「動的な名前を持つ子要素を表示」

mf_dynamic_node_names_01

図. 1        (子要素のための) 動的なノード名の有効化

メモ:上のコマンドは、子ノードを持つノードのみに対して使用することができます。また、コマンドはフットノードには使用することができません。

 

ノードを動的なモードに切り替えると、下に表示されるダイアログボックスに類似したダイアログボックスが表示されます。このトピックの目的のために、オプションを下に表示されるように設定します。これらのオプションは特定の型のノードにアクセスする内で説明されています。

mf_dynamic_node_names_02

図 2        「動的に名前がつけられた子の設定」 ダイアログボックス

図 3 は、product ノードのために動的なノード名が有効化されている場合、どのようにコンポーネントが表示されるかを示しています。コンポーネントの外観が大幅に変更されていることに注意してください。

mf_generic_child_elements

図3        (要素のために) 動的なノード名が有効化されている場合

コンポーネントを標準モードに切り替えるには、 product ノードを右クリックして、 コンテキストメニューからオプション 「動的な名前を持つ子要素を表示する」 を無効化します。

 

下のイメージは、ノードの属性への動的なアクセスが有効化された時、同じコンポーネントがどのように表示されるかを示しています。product 要素を右クリックして、コンポーネントが取得され、 コンテキストメニューから「動的な名前を持つ属性を表示する」を選択します。

mf_dynamic_attributes

図 4        (属性のために) 動的なノード名が有効化されている場合

コンポーネントを標準モードに切り替えるには、 product ノードを右クリックして、コンテキストメニューから、 「動的な名前を持つ属性を表示する」 オプションを無効化します。

 

図 3 と 図 4 に示されているように、コンポーネントの外観はノード (この場合は、 product) が「動的なノード名」なモードに切り替えられると変更されます。新しい外観は、次のアクションを取る可能性を広げます:

 

すべてのノードの子要素または属性のリストを読み取り、または書き込みます。これらは、 element() または attribute() アイテムによりそれぞれ提供されます。
各子要素または属性の名前を読み取り、または書き込むます。名前は、 node-name()local-name() アイテムにより提供されます。
要素の場合、各子要素の値を特有のデータ型として読み取る、または書き込みます。この値は、型キャストノード (この場合は、 xs:string アイテム)により与えられます。要素のみが型キャストノードを持つことができることに注意してください。属性は、常に、「文字列」 型として処理されます。
名前別に子要素をグループ化します。例に関しては次を参照してください 例: 名前別にノードをグループ化またはフィルターする

 

「動的なノード名」 モード内で作業することのできるノード型は、下で説明されています。

 

element()

ターゲットコンポーネントと比較すると、このノードはソースコンポーネント内で異なる振る舞いをします。ソース コンポーネント内で、ノードの子要素をシーケンスとして提供します。図 3 element()は、全ての product子要素のリスト(シーケンス)を与えています。 例えば、次の XML から作成されたシーケンスは、3つのアイテムを含みます (これは、 product 3つのつの 子要素が存在するからです):

 

  <product>

    <id>1</id>

    <color>red</color>

    <size>10</size>

  </product>

 

シーケンス内の各アイテムの実際の名前 と 型は、 node-name() ノード と 型キャストノードによりそれぞれ与えられています 上記を理解するには、ソースからのデータ XML を ターゲット XML に次のように変換する必要があると仮定してください:

mff_genericnodes_01

図 6        シーケンス内の各アイテムの実際の名前 と 型は、 node-name() ノード と 型キャストノードによりそれぞれ与えられています 上記を理解するには、ソースからのデータ XML を ターゲット XML に次のように変換する必要があると仮定してください:

マッピングの目的を達成するマッピングは以下のようになりますマッピング:

mf_map_ConvertProducts_04

図 7        (MapForce 内で) XML 要素名 を属性値 にマッピングする

node-name()text() は、シーケンス内の各アイテムの値と実際の名前を与えますが、element() のここでの役割は、 product の子要素のシーケンスを提供します。この マッピングは、チュートリアルのサンプルが付随しており、以下で更に詳しく説明されています: 例: 要素名を属性値にマップする

 

ターゲットコンポーネント内では、 element() は、ソース内の各アイテムのマッピングの基本ルールの例外であるとおり自身では何も作成しませんが、1つのターゲットアイテムを作成します。実際の要素 は、(node-name()の値を使用して)型キャストノード と(自身の名前を使用して)名前テストノードにより作成されます。

 

attribute()

図 4 内で表示されているように、このアイテムは、マッピングのランタイムでノードの全ての属性へのアクセスを有効化します。ソースコンポーネント内で、接続されたソースノードの属性をシーケンスとして提供します。例えば、 次の XML 内で、シーケンスは、(product には2つの属性が存在するため)2つのアイテムを含みます:

 

  <product id="1" color="red" />

 

attribute() ノードは、シーケンス内の各属性の値のみを文字列の型として与えます。各属性の名前は node-name() ノードにより与えられます。

 

ターゲットコンポーネント内では、このノードは、接続されたシーケンスを処理し、シーケンス内の各アイテムのために属性の値を作成します。属性の名前は、 node-name() により与えられます。例えば、ソースからのデータ XML を ターゲット XML を以下のように処理すると想定します:

mff_genericnodes_02

図 8        属性の値を属性名にマッピングする(必須)

この目的を達成するマッピングは以下のようになります:

mff_genericnodes_02c

図 9        (MapForce 内で)属性の値を属性名にマッピングする

メモ:この変換は、ノードの属性へのアクセスを有効化せずに行うことができます。ここでは、どのように attribute()がターゲットコンポーネント内で動作するかを表示しています。

 

この マッピングを再作成する場合は、 <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\ フォルダー内の ConvertProducts.mfd マッピングと同じ XML コンポーネントを使用しています。マッピングとして使用します。唯一の違いは、ターゲットがソースになり、ソースがターゲットになることのみです。 ソースコンポーネントのための入力データには、属性の値を実際に含む XML インスタンスが必要になります。例:

 

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <attribute name="id" value="1"/>
    <attribute name="color" value="red"/>
    <attribute name="size" value="big"/>
  </product>
</products>

 

上記のコードリスティングでは、名前空間とスキーマ宣言が、ここでは簡単にするために省略されていることに注意してください。

 

node-name()

ソースコンポーネント内では、 node-name() は、 element()の子要素の名前、または、 attribute()の要素の名前をそれぞれ提供します。デフォルトでは、提供される名前は、 xs:QName の型です。名前を文字列として取得するには、 local-name()  ノードを(図 3 を参照してください)、または、 関数 QName-as-string を使用します。

 

ターゲットコンポーネント内では node-name() は、element() または attribute()内に含まれる各要素または属性の名前を書き込みます。

 

local-name()

このノードは、 node-name() と同様の作動をしますが、 異なる点は、xs:QName の代わりに xs:string が使用されていることです。

 

型キャストノード

ソースコンポーネント内では、型キャストノードは、element() 内の各子要素の値を提供しますこのノードの名前と構造は、「動的に名前がつけられた子の設定」 ダイアログボックス (図 2)から選択された型により異なります。

 

ノードの型を変更する場合は、 「選択の変更」 ( mf_ic_change_selection ) ボタンを使用して、スキーマワイルドカード (xs:any) を含む、使用できる型から希望する型を選択します。詳細に関しては、次を参照してください: 特定の型のノードにアクセスする

 

 

ターゲットコンポーネント内で、 型キャストノードは、element() 内に含まれる各子要素の値特有のデータ型として書き込みます。希望するデータ型は「選択の変更」 ( mf_ic_change_selection ) ボタンをクリックすることにより選択することができます

 

名前テストノード

ソースコンポーネント内では、 名前テストノードは、ソースインスタンスから名前別に子要素をグループ化、または、フィルターする方法が提供されています。正確な型を使用してマッピングが、インスタンスデータにアクセスしていることを保証するために子要素を名前別にフィルターする必要がある場合があります。(次を参照してください: 特定の型のノードへのアクセス)。 例えば、例: 名前別にノードをグループ化またはフィルターするを参照してください。

 

一般的には、名前テストノードは、値とサブ構造の読み取りと書き込みをする通常の要素ノードとほぼ同様の作動をします。しかしながら、動的なアクセスが有効化されていると、マッピングのセマンティクスが異なるため、制限が発生します。例えば、2つの名前テストノードを連結することはできません。

 

ターゲット側では、名前テストノードは、接続されているソースシーケンスにアイテムが存在するため、出力内と同じ数量の要素を作成します。これらの名前は、 node-name()にマップされている値を上書きします。

 

必要であれば、コンポーネントから名前テストノードを非表示にすることができます。 これを行うには、 element() ノードの横の 「選択の変更」 ( mf_ic_change_selection ) ボタン をクリックします。そして、 「動的な名前を持つ子の設定」 ダイアログボックスから、「名前テストノードの表示」 チェックボックスのチェックを解除します。


(C) 2019 Altova GmbH