XML Module での XQuery の使用 - Mule 4

<xml-module:xquery-transform>​ 操作は、XQuery 式の評価をサポートしています。

XQuery 式は各要素の任意の数値に一致する可能性があるため、この操作によって文字列のリストが返されます。要素が式に一致しない場合、この操作によって空のリストが返されます。

MuleSoft は XQuery 標準をサポートしていますが、DataWeave でも同じユースケースを実現でき、XML ドキュメントを抽出して変換するツールとして DataWeave をお勧めします。

次の例は、XQuery を使用してブックリストを操作する方法を示しています。

入力: ブックリスト

次の例では、XQuery を使用して上記のブックリストを変換しています。

XQuery 変換スクリプト
 <xml-module:xquery-transform>
    <xml-module:xquery><![CDATA[
        xquery version "3.0";
        declare copy-namespaces no-preserve, inherit;
        declare variable $document external;

        for $b in $document//BOOKS/ITEM
        order by string-length($b/TITLE) return
        <book>
            <author> { $b/AUTHOR } </author>
            <title> { $b/TITLE } </title>
        </book>
    ]]></xml-module:xquery>
</xml-module:xquery-transform>
xml

次の XQuery 変換により、各エントリが次の各 ​<book>​ 要素に対応する文字列のリストが生成されます。

出力 XML

デフォルトでは、この操作はメッセージペイロードレベルで XML ドキュメントを変換しようとします。ただし、​content​ パラメーターを使用して入力ドキュメントを提供できます。

例: コンテンツパラメーターの使用
<flow name="books">
    <file:read path="books.xml" target="books" />
    <xml-module:xquery-transform>
        <xml-module:content>#[vars.books]</xml-module:content>
        <xml-module:xquery><![CDATA[
            xquery version "3.0";
            declare copy-namespaces no-preserve, inherit;
            declare variable $document external;

            for $b in $document//BOOKS/ITEM
            order by string-length($b/TITLE) return
            <book>
                <author> { $b/AUTHOR } </author>
                <title> { $b/TITLE } </title>
            </book>
        ]]></xml-module:xquery>
    </xml-module:xquery-transform>
</flow>
xml

上記の例では、他の場所 (この場合、ファイルシステムのファイル) からコンテキストを取得し、シンプルな式から参照しています。

XQuery スクリプトの個別のファイルへの外部化

XQuery スクリプトを Mule アプリケーションに組み込まずに済むように、次のように、ファイルを使用してモジュールに渡すことができます。

<xml-module:xquery-transform>
    <xml-module:xquery>${file::scripts/books.xquery}</xml-module:xquery>
</xml-module:xquery-transform>
xml

より複雑なユースケースでは、使用するスクリプトが外的な条件に応じて異なる場合もあります。たとえば、使用する実際の変換が ​userID​ に応じて異なるマルチテナントのインテグレーションを考えてみます。

複雑な例
<flow name="multitenantExample">
    <http:listener path="transform" allowedMethods="POST" config-ref="httpListener" /> (1)
    <file:read path="#['xquery/$(attributes.queryParam.userId).xquery']" target="xquery" /> (2)
     <xml-module:xquery-transform>
        <xml-module:xquery>#[vars.xquery]</xml-module:xquery>
    </xml-module:xquery-transform>
</flow>
xml
  1. このフローは HTTP 要求によってトリガーされます。

  2. この例では、​userID​ がクエリパラメーターとして提供されていることと想定し、File Connector を使用して正しい XQuery スクリプトを読み取り、変数に保存します。

  3. モジュールは、Read 操作を使用して取得された XQuery スクリプトを参照する式を使用して変換を実行します。

HTTP Connector と File Connector は単に例として使用しています。同様のユースケースを実行するために必要なわけではありません。

コンテキストプロパティおよび複数の入力の使用

対応する ​xpath​ や ​xslt​ と同じように、​xquery​ 操作は引数を変換に渡せるコンテキストパラメーターをサポートしています。

たとえば、上記の ​books​ XML を次の ​cities​ XML ドキュメントと組み合わせるとします。

入力
<?xml version="1.0" encoding="UTF-8"?>
<cities>
    <city name="milan" country="italy" pop="5"/>
    <city name="paris" country="france" pop="7"/>
    <city name="munich" country="germany" pop="4"/>
    <city name="lyon" country="france" pop="2"/>
    <city name="venice" country="italy" pop="1"/>
</cities>
xml

このユースケースの例を見てみましょう。

XQuery 変換スクリプト
<flow name="multipleInputs">
  <file:read path="books.xml" target="books" />
  <file:read path="cities.xml" target="cities" /> (1)
  <xml-module:xquery-transform>
    <xml-module:xquery>
      <![CDATA[
          xquery version "3.0";
          declare variable $document external;
          declare variable $cities external; (2)
          declare variable $books external; (3)
          <mixes>
            {
              for $b in fn:doc($books)/BOOKLIST/BOOKS/ITEM,
                $c in fn:doc($cities)/cities/city (4)

              return <mix title="{$b/TITLE/text()}" city="{$c/@name}" /> (5)
            }
          </mixes>
      ]]>
    </xml-module:xquery>
    <xml-module:context-properties>
      #[{'books' : vars.books, 'cities': vars.cities}]
    </xml-module:context-properties> (6)
  </xml-module:xquery-transform>
</flow>
xml
1 入力ドキュメントを読み取り、コンテンツを変数に保存します。この例では File Connector を使用していますが、任意のデータソースを使用できます。
2 XQuery スクリプトで ​$cities​ 変数を宣言します。
3 XQuery スクリプトで ​$books​ 変数を宣言します。
4 $​ プレフィックスを使用して両方のドキュメントを参照し、両方を反復します。
5 出力要素を生成します。
6 DataWeave および ​<xml-module:context-properties>​ パラメーターを使用してプロパティをバインドします。

スクリプトは、1 つの項目のみが含まれる文字列のリストを出力します。

出力

関連情報