# 既存のループ式を再使用

LoopReferenceファンクションを使えば、前に別のエレメントで定義されたループ式を再使用できます。

## 始める前に

入力ストラクチャーと出力ストラクチャーを持つマップを作成済みであること。次のサンプルを使用できます。

## このタスクについて

この例では、顧客情報が含まれているXMLファイルを使います。各customerエレメントには顧客の名前とその状態が含まれています。顧客が状態別にグルーピングされているXML出力を作成したいとします。入力には次のXMLサンプルを使います:

```
<customers>
	<customer>
		<lastName>Harrison</lastName>
		<firstName>Emily</firstName>
		<state>New Jersey</state>
	</customer>
	<customer>
		<lastName>Reagan</lastName>
		<firstName>James</firstName>
		<state>New Jersey</state>
	</customer>
	<customer>
		<lastName>Smith</lastName>
		<firstName>Karen</firstName>
		<state>Texas</state>
	</customer>
</customers>
```

次のXMLサンプルを使えば、出力ストラクチャーを作成できます:

```
<root>
	<customers>
		<state/>
		<customer>
			<lastName/>
			<firstName/>
		</customer>
		<customer>
			<lastName/>
			<firstName/>
		</customer>
	</customers>
	<customers>
		<state/>
		<customer>
			<lastName/>
			<firstName/>
		</customer>
		<customer>
			<lastName/>
			<firstName/>
		</customer>
	</customers>
</root>
```

## 手順

1. 出力customersエレメントを右クリックし、[Split Loop] (ループの分割)をクリックして、state値ごとに個別のループを作成します。

   ![](https://help.qlik.com/talend/ja-JP/data-mapper-functions-reference-guide/Resources/images/reuse_loop_expression_01_split.png)
2. 出力ストラクチャーにある最初のcustomersループをクリックし、[Loop] (ループ)タブでFixedLoopファンクションをドラッグ＆ドロップします。

   これは、出力がこのループの反復を1つだけ生成することを示すために使われます。
3. Constantファンクションを最初の出力stateエレメントにドラッグ＆ドロップしてこのファンクションをダブルクリックし、[Value] (値)フィールドにNew Jerseyと入力して[OK]をクリックします。
4. 入力customerエレメントを最初の出力customerエレメントにドラッグ＆ドロップします。

   SimpleLoopファンクションが自動的に追加されます。
5. EqualファンクションをSimpleLoopのFilter引数にドラッグ＆ドロップします。
6. 入力stateエレメントをFirst Value引数に、そして最初の出力stateエレメントをSecond Value引数にそれぞれドラッグ＆ドロップします。

   ![](https://help.qlik.com/talend/ja-JP/data-mapper-functions-reference-guide/Resources/images/reuse_loop_expression_02_simpleloop.png)
7. customers[2]エレメントをクリックし、[Loop] (ループ)タブでFixedLoopファンクションをドラッグ＆ドロップします。
8. Constantファンクションを2番目のstateエレメントにドラッグ＆ドロップし、その値をTexasに設定します。
9. 2番目の出力customersループをクリックし、[Loop] (ループ)タブでLoopReferenceファンクションをドラッグ＆ドロップします。
10. 最初の出力customerループをMap Element引数にドラッグ＆ドロップします。

    これによって、このエレメントで使われているループが最初のcustomerエレメントで定義されたループと同じものとなるよう指定できるようになります。LoopCopyファンクションとは違って、LoopReferenceは参照先ループで定義されたフィルターやソートキーを適用しません。
11. EqualファンクションをFilter引数に追加し、stateをFirst Valueに、2番目の出力stateをSecond Valueにそれぞれ設定します。
12. 入力customerエレメントを2番目の出力customerにドラッグ＆ドロップし、子エレメントをマッピングさせます。

## タスクの結果

マップが設定され、次のように表示されます。 ![](https://help.qlik.com/talend/ja-JP/data-mapper-functions-reference-guide/Resources/images/reuse_loop_expression_03_result.png)

[Test Run] (テスト実行)機能を使えば結果を表示できます。この例では次のような出力が返されます。

```
<root>
  <customers>
    <state>New Jersey</state>
    <customer>
      <lastName>Harrison</lastName>
      <firstName>Emily</firstName>
    </customer>
    <customer>
      <lastName>Reagan</lastName>
      <firstName>James</firstName>
    </customer>
  </customers>
  <customers>
    <state>Texas</state>
    <customer>
      <lastName>Smith</lastName>
      <firstName>Karen</firstName>
    </customer>
  </customers>
</root>
```