リスト属性(List Attributes)

FMEリファレンス > リスト属性
最終更新: 2021-12-23 | FME 2021.2.0.1

リスト属性の基本

FMEには、一般の属性(ひとつの名前でひとつの値を格納する)の他に、名前と { } で括ったインデクス(0から始まる連番)の組み合わせによって、ひとつの名前で関連性のある複数の値を一括して取り扱うためのリスト属性(list attributes)の仕組みがあります。
“リスト名{n}”(nはインデクス)をリスト属性の要素(element)と呼び、個々の要素は一般の属性と同様に扱うことができます。

処理結果をリスト属性に格納して出力フィーチャーに付加するトランスフォーマーはたくさんあります。

例えば、次の AttributeSplitter は、Attribute to Split パラメーターに指定した属性(fme_basename) の値を Delimiter or Format String パラメーターに指定した区切り文字列(この例ではハイフン)で分割し、List Name パラメーターに指定した名前(_list)のリスト属性に分割後の文字列を格納して出力フィーチャーに付加します。

入力フィーチャーの fme_basename 属性に格納されている文字列が “FG-GML-5438-43-00-DEM5A-20180226″(基盤地図情報DEMファイル名の例)ならば、出力フィーチャーに付加されるリスト属性 _list{} の各要素には次のように値 (分割後の文字列) が格納されます。

リスト要素
_list{0}FG
_list{1}GML
_list{2}5438
_list{3}43
_list{4}00
_list{5}DEM5A
_list{6}20180226

これ以降に接続するトランスフォーマーでは、_list{n}(nはインデクス)の書式によってリスト属性の特定の要素にアクセスすることができます。

通常、トランスフォーマーの属性リスト内でリスト属性は前出の図のように {} つきで表示されますが、その部分を右クリックして表示されるメニューの Expose Elements でリスト要素の選択 (Select List Elements) 画面を開き、インデクスを指定することによって特定の要素を個別に表示させることもできます。
インデクスは、カンマ区切りによる個別、ハイフンによる範囲、あるいはそれらの混在によって指定できます。


構造化リスト (Structured Lists)

リスト属性には、次のようにドットをはさんで連結された文字列によって修飾されたものもあり、修飾を伴わないリスト属性と区別するときには、この形態のリスト属性を「構造化リスト(structured lists または complex lists)」と呼びます。

_list{}.member1
_list{}.member2

構造化リストには、同じインデクスの要素に修飾文字列(上の例では member1, member2)で識別される複数の値が格納され、インデクスごとに事物が持つ複数の属性で構成されるデータ構造を保持することができます。事物はインデクスで識別され、その事物の属性を保持するデータ構造の個々のメンバーは修飾文字列で識別されることから、これらの修飾文字列はメンバー名と呼ばれることもあります。

例えば、Aggregator によって複数のフィーチャーのジオメトリを集約してマルチパートのジオメトリを持つひとつのフィーチャーに変換する場合に、List Name パラメーターでリスト名を指定することにより、入力フィーチャーが持っていた全ての属性を構造化リストに格納して集約後のフィーチャーに引き継ぐことができます。

Aggregator が出力フィーチャーに与える構造化リストのメンバー名は、入力フィーチャーが持っていた属性名と等しくなります。例えば、図のように入力フィーチャーが ID, Name という名前の属性を持っていたならば、集約後のフィーチャーに与えられる構造化リストは次のようになります。

_list{}.ID
_list{}.Name

この構造化リストの要素数は集約されたフィーチャーの数に等しく、インデクスで識別される個々のデータ構造のメンバーの集合が、集約前の個々のフィーチャーが持っていた属性の集合に対応します。
つまり、集約前の個々のフィーチャーの属性 [ID, Name] の値が [_list{i}.ID, _list{i}.Name] (i = 0,1,2…) に格納されて集約後のフィーチャーに引き継がれるということです。


入れ子リスト (Nested Lists)

リスト属性は、入れ子のようにその要素としてリスト属性を持つこともできます。

リスト名{}.下位リスト名{}

入れ子は何段階にもでき、また、下位のリストは構造化リストである場合もあります。
入れ子リストの使用頻度はそれほど多くはありませんが、XMLのように階層構造を持つデータを処理する場合などで必要になることがあります。

例えば、次のXMLドキュメントをXMLリーダー (Configuration Type: Feature Paths, Elements to Match: Feature, Flattening: 有効) で読み込んだときには、<Value> 要素の値を格納する “Attribute{}.Value{}” という入れ子リストが読み込まれたフィーチャーに与えられます。

<?xml version="1.0"?>
<Dataset>
  <Feature>
  <Attribute>
      <Value>1</Value>
      <Value>2</Value>
    </Attribute>
    <Attribute>
      <Value>3</Value>
      <Value>4</Value>
      <Value>5</Value>
    </Attribute>
  </Feature>
</Dataset>
リスト要素
Attribute{0}.Value{0}1
Attribute{0}.Value{1}2
Attribute{1}.Value{0}3
Attribute{1}.Value{1}4
Attribute{1}.Value{2}5

要素へのアクセスは、次の書式でインデクス (n, m) を指定することによって行えます。

Attribute{n}.Value{m}