# マッピングを設定

ファンクションを使い、ストラクチャーで実行する変換を定義します。 次の例は複雑なマッピングパターンをいくつか表したものです。

## ネスト化されたループを単純なループに結合

ネスト化されたループを結合させることで、ネスト化されたループを持つXMLストラクチャーをフラットなCSVストラクチャーに変換します。

### 始める前に

マップを作成し、入力ストラクチャーと出力ストラクチャーを追加済みであること。

### このタスクについて

この例では、入力XMLファイルには発注書に関する情報が含まれています。各AddressエレメントにはItemsエレメントが含まれており、これにはItemエレメントが少なくとも1つ含まれています。変換の目標は、それぞれのItemについて行があるCSVファイルを用意することです。各行には関連する配送先情報も含まれている必要があります。

この例では、入力として次のXMLサンプルを使います:

```
<PurchaseOrderShipping PurchaseOrderNumber="99503" OrderDate="2011-03-15T12:10:03+05:30">
                  <ShipDate>2011-04-30T23:50:00+05:30</ShipDate>
                  <Address>
                  <Name>Deandre King</Name>
                  <Street>4894  Winding Way</Street>
                  <City>Southfield</City>
                  <State>MI</State>
                  <Zip>48075</Zip>
                  <Country>USA</Country>
                  <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
                  <Items>
                  <Item PartNumber="872-AA">
                  <ProductName>Lawnmower</ProductName>
                  <Quantity>1</Quantity>
                  <USPrice>148.95</USPrice>
                  <Comment>Confirm this is electric</Comment>
                  </Item>
                  <Item PartNumber="926-AA">
                  <ProductName>Baby Monitor</ProductName>
                  <Quantity>2</Quantity>
                  <USPrice>39.98</USPrice>
                  </Item>
                  </Items>
                  </Address>
                  <Address>
                  <Name>Burl Clark</Name>
                  <Street>3807 Pointe Lane</Street>
                  <City>Fort Lauderdale</City>
                  <State>FL</State>
                  <Zip>33308</Zip>
                  <Country>USA</Country>
                  <Items>
                  <Item PartNumber="356-KX">
                  <ProductName>Gas canister</ProductName>
                  <Quantity>1</Quantity>
                  <USPrice>123.02</USPrice>
                  </Item>
                  </Items>
                  </Address>
                  </PurchaseOrderShipping>
```

出力ストラクチャーは以下のように定義されています:

```
ItemsShipping
                  item (0:*)
                  PurchaseOrderNumber
                  ShipTo
                  ShipDate
                  PartNumber
                  ProductName
                  Quantity
                  USPrice
```

### 手順

1. 入力PurchaseOrderNumberとShipDateを、対応する出力エレメントに配置します。
2. [Functions] (ファンクション)タブを開き、Concatファンクションを出力ShipToエレメントにドラッグします。

   このファンクションは、入力からのさまざまな住所エレメントを1つの出力エレメントに連結させるために使われます。
3. 次の入力エレメントを、ShipTo出力エレメントの[Value] (値)タブにあるConcatファンクションに配置します。
   * [Name] (名前)
   * Street
   * City
   * State
   * Zip
   * [Country] (国)

   情報メモヒント: Concatにエレメントをリストの最上位に配置したり、別のエレメントの前後に配置したりできます。

   ![入力エレメントの配置。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/combine_nested_into_simple_01_concat.png)
4. Concatファンクションをダブルクリックし、連結されたエレメント間に追加する文字列を定義します。

   このパラメーターはデフォルトで空になっています。たとえばスペースで住所を部分ごとに区切る場合は、[Join String] (Join文字列)フィールドにスペースを入力します。
5. 入力PartNumberエレメントを対応する出力に配置します。

   出力ストラクチャーは入力Addressエレメントで既にループしているため、競合が発生します。
6. ダイアログボックスが開いたら、[Change the output map element looping] (出力マップエレメントルーピングの変更)を選択し、OKをクリックします。

   このオプションを選択すると、出力ストラクチャーが入力Itemエレメントでループします。コンテキストは出力Itemループに自動的に追加されます。

   ![出力itemループに追加されたコンテキスト。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/combine_nested_into_simple_02_context.png)

   そのため、Addressエレメントに複数のItemエレメントがある場合、出力に各Itemの行が含まれるようになります。
7. 入力エレメントであるProductName、Quantity、USPriceを、対応する出力エレメントに配置します。

### タスクの結果

これでマッピングが設定されます。サンプルドキュメントがある場合は、[Test Run] (テスト実行)をクリックして結果を確認します。この例では、次のようになっています。

```
PurchaseOrderNumber,ShipTo,ShipDate,PartNumber,ProductName,Quantity,USPrice
               99503,Deandre King 4894  Winding Way Southfield MI 48075 USA,2011-04-30T23:50:00+05:30,872-AA,Lawnmower,1,148.95
               99503,Deandre King 4894  Winding Way Southfield MI 48075 USA,2011-04-30T23:50:00+05:30,926-AA,Baby Monitor,2,39.98
               99503,Burl Clark 3807 Pointe Lane Fort Lauderdale FL 33308 USA,2011-04-30T23:50:00+05:30,356-KX,Gas canister,1,123.02
```

## ネスト化されたループを単純なループに集計

ネスト化されたループを集計することで、ネスト化されたループを持つXMLストラクチャーをフラットなCSVストラクチャーに変換します。

### 始める前に

マップを作成し、入力ストラクチャーと出力ストラクチャーを追加済みであること。

### このタスクについて

この例では、[ネスト化されたループを単純なループに結合](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/8.0/combining-nested-loops-into-simple-loop)と同じ入力ストラクチャーが使用されています。この変換の目標は、各Addressエレメントに配送と製品に関する情報が含まれている行を持つCSVファイルを作成することです。

住所に配送されるすべての製品が各行に含まれるよう、出力ストラクチャーには複数のPartNumberエレメントとProductNameエレメントが含まれています。次のように定義されています:

```
AddressesShipping
                  Address (0:*)
                  Name
                  Street
                  City
                  State
                  Zip
                  Country
                  DeliveryNotes
                  PartNumber_1
                  ProductName_1
                  PartNumber_2
                  ProductName_2
                  PartNumber_3
                  ProductName_3
```

### 手順

1. 次の入力Componentエレメントを対応する出力エレメントに配置します:
   * [Name] (名前)
   * Street
   * City
   * State
   * Zip
   * Country
   * DeliveryNotes
2. 入力PartNumberエレメントを出力PartNumber\_1に配置します。

   出力ストラクチャーは入力Addressエレメントで既にループしているため、競合が発生します。
3. ダイアログボックスが開いたら、[Generate AgConcat value expression] (AgConcat値の式をに生成)を選択し、OKをクリックします。

   このオプションを使用すると、各Addressエレメントに含まれているPartNumberエレメントの値がすべて、AgConcatファンクションで1つのフィールドに集計されます。1つのフィールドに1つの値を持つようにしたい場合は、フィルターを使用する必要があります。 ![AgConcatファンクションの使用。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/aggregate_nested_into_simple_01_agconcat.png)
4. SingleIndexファンクションを、出力PartNumber\_1エレメントの[Value] (値)タブにあるFilter引数に配置します。

   最初のPartNumberエレメントの値を取得する場合は、インデックスのデフォルト値のままにしておきます。
5. 入力PartNumberエレメントを出力PartNumber\_2エレメントとPartNumber\_3エレメントに配置し、表示されるダイアログボックスで[Generate AgConcat value expression] (AgConcat値の式をに生成)選択してOKをクリックします。

   フィルターは、PartNumber\_1で定義された式に基づいて自動的に設定されます。 ![出力エレメントに対するPartNumberエレメントのマッピング。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/aggregate_nested_into_simple_02_filters_part.png)
6. 前のステップを繰り返し、入力ProductNameエレメントを出力ProductName\_1、ProductName\_2、ProductName\_3の各エレメントにマッピングします。
   ### 例

   ![出力エレメントに対するProductNameエレメントのマッピング。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/aggregate_nested_into_simple_03_filters_product.png)

### タスクの結果

これでマッピングが設定されます。サンプルドキュメントがある場合は、[Test Run] (テスト実行)をクリックして結果を確認します。この例では、次のようになっています。

```
Name,Street,City,State,Zip,Country,DeliveryNotes,PartNumber_1,ProductName_1,PartNumber_2,ProductName_2,PartNumber_3,ProductName_3
               Deandre King,4894  Winding Way,Southfield,MI,48075,USA,Please leave packages in shed by driveway.,872-AA,Lawnmower,926-AA,Baby Monitor,,
               Burl Clark,3807 Pointe Lane,Fort Lauderdale,FL,33308,USA,,356-KX,Gas canister,,,,
```