このサイトをビューするために JavaScript を有効化してください。

Altova MapForce 2020 Basic Edition

このサンプルは、再帰的なユーザー定義関数の助けを使用してソース XML ファイル内でデータを検索するマッピングを表しています。 マッピングファイルは次のパスで見つけることができます: <マイ ドキュメント>\Altova\MapForce2020\MapForceExamples\RecursiveDirectoryFilter.mfd

mf_udf_22

RecursiveDirectoryFilter.mfd

ソース XML ファイルには、下のコードリストに示されているとおり、ファイルとディレクトリに関する情報が含まれています(リスティングではデータの一部が省略されていることに注意してください) :

 

<?xml version="1.0" encoding="UTF-8"?>
<directory name="Examples">
  <directory name="ExampleSite">
    <file name="blocks.sps" size="7473"/>      
    <file name="block_file.xml" size="992"/>
    <directory name="output">
        <file name="examplesite1.css" size="3174"/>
        <directory name="images">
          <file name="blank.gif" size="88"/>
          <file name="block_file.gif" size="13179"/>            
        </directory>
    </directory>
  </directory>  
</directory>

ソース XML ファイル

ソースとターゲット XML ファイルは同じスキーマ Directory.xsd を使用します。ファイルシステム上で、ディレクトリはファイルまたは他のディレクトリを含むことができ、これはスキーマ内で反映されます。重要な点は、スキーマが 「ディレクトリ」 要素が再帰的であることを指定していることです (ライン <xs:element ref="directory"/> を参照してください)。

 

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="directory">
    <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="file">
              <xs:complexType>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="size" type="xs:unsignedLong"/>
              </xs:complexType>
          </xs:element>
          <xs:element ref="directory"/>
        </xs:choice>
        <xs:attribute name="name"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Directory.xsd

マッピングのビジネスの必要条件は、特定の拡張子を持つファイルのみをフィルターします。すべてのディレクトリのネストされた構造は、保存される必要があります。 例えば、拡張子が ".xml" の場合、 (ソース XML ファイルが以前にリストされているため) 期待される出力は以下に類似します:

 

<?xml version="1.0" encoding="UTF-8"?>
<directory name="Examples">
  <directory name="ExampleSite">
    <file name="block_file.xml" size="992"/>
    <directory name="output">
        <directory name="images"/>
    </directory>
  </directory>
</directory>

期待される XML 出力

2番目に、マッピングの発信者は、パラメーターとしてファイル拡張子を提供する必要があります。 デフォルトで、発信者がパラメーターの値を提供しない場合、マッピングは拡張子を持つ .xml ファイルをフィルターアウトします。

 

上記の必要条件を対処するために、マッピングにはテキスト定数を介してデフォルトのファイルの拡張子を提供する単純型入力パラメーター、 "SearchFor"、が含まれています。 このパラメーターは任意です ( 「入力は必須」 チェックボックスはプロパティダイアログボックス内で選択されていません):

mf_udf_23

入力パラメーターに関する詳細は、 マッピングにパラメーターを与えるを参照してください。

 

次に、マッピングにはユーザー定義関数、"FilterDirectory" が含まれています。この関数は再帰的で、自身への呼び出しも含んでいます。 再帰的な要素の「ディレクトリ」に接続されているため、この関数はソース XML インスタンス内のネストされた「ディレクトリ」 要素を必要なだけ呼び出すことができます。再帰的な呼び出しをサポートするために、この関数は、インライン関数ではなく、正規関数として作成されています (「インラインの使用」 オプションは、関数のプロパティ内で選択されていません)。関数のプロパティを確認するには、マッピング内の空のエリアを右クリックし、コンテキストメニューから「関数の設定」を選択します。 ユーザー定義関数の編集を参照してください。

mf_udf_24

上記で示されるように、関数は入力として2つのパラメーターを取ります:

 

1. 検索される XML 構成を定義する複合型パラメーター、Directory 、(このパラメーター は 「haystack」 です)。

2. 検索するファイル拡張子を指定する文字列パラメーター、SearchFor、(このパラメーターは 「needle」 です)。

 

マッピング上の入力または出力パラメーターのタイトルバーを右クリックして、設定を確認します。

 

関数には、 MapForce ビルトイン関数 contains が接続されているフィルターコンポーネントが含まれています。 contains 関数は、検索の値がソース 構成内の "name" 属性 (ファイル名)に一致する場合、 true を返します。 true の値は、フィルターに現在のアイテムを出力にコピーするように命令します。それ以外の場合、スキップされます。フィルターに関する詳細は、フィルターと条件を参照してください。

 

関数の directory パラメーター (入力と出力の双方) 同様、マッピングの、ソースとターゲットファイルは同じスキーマ Directory.xsd を持ちます。 MapForce は、これらの型の割り当ては整合性があると検知し、入力パラメーター と関数間の接続の型は「全てコピーする」 です。 全てコピー接続 を参照してください。

 

マッピングの実行

MapForce 内で、マッピングの実行をプレビューするには、「出力」 タブをクリックします。 デフォルトの入力パラメーター (".xml") を使用してマッピングは実行され、この結果、この検索結果に一致する結果のみが抽出されます。異なる検索の条件を提供するには、入力パラメーターへ接続されている定数を".xml" から ".sps" に変更し、マッピングを再度実行します。

(C) 2019 Altova GmbH