[CAIレシピ] CAIでXQueryを利用する時に覚えておきたいこと

## はじめに
CAIプロセスの実装時には、フィールドへの値の割り当てを計算式として指定できます。計算式では関数を指定するだけではなく、XQuery言語で記述したコードを指定することもできます。

XQuery言語に なじみ のない方もいらっしゃると思うので、本記事ではCAIプロセス開発でXQueryを利用する場合に最初に覚えておきたいことを紹介してみようと思います。



## CAIがサポートするXQueryのバージョン

XQueryにはいくつかバージョンがあり、CAIでは XQuery 3.0 をサポートしています。

>[HOW TO: Parse JSON and retrieve the values of the ...](https://knowledge.informatica.com/s/article/575436?language=en_US)
>XQuery programming language provides a means to extract and manipulate data from XML documents or any data source that can be viewed as XML.
Currently, we use __XQuery version 3.0__ within the Cloud Application Integration.

なお、CAIではXQuery 1.0以降でサポートされている関数宣言(declare function)をサポートしていません。基本的にXQuery 3.0をサポートしているものの制限事項もあるようです。

>[FAQ: Is it possible to write custom functions or user defined functions for XQuery in CAI?](https://knowledge.informatica.com/s/article/000210823?language=en_US)
>Please note that __it is not possible to explicitly declare functions__ within a process generated through Application Integration Designer.



## 利用可能なXQuery関数

CAIプロセスの開発では、XQueryの標準関数(fn:xxx)に加えて、IICS側で用意している関数も利用できます。利用可能な関数の一覧は次のドキュメントから確認できます。
[Design > Understanding Data Types and Field Properties > Using Functions](https://docs.informatica.com/integration-cloud/application-integration/current-version/design/understanding-data-types-and-field-properties/using-functions.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/2babef7e-abbb-51d0-109b-a94c271523d4.png)




## XQueryの基本 - FLWOR構文

XQueryの基本になるFLWOR構文を理解しておくと、XQueryを利用したコーディングを理解しやすいと思います。FLWOR構文は、以下の5つの要素から構成されます。

- For ... 変数を使ってデータの反復処理を行う
- Let ... 変数に値を割り当てる
- Where ... 条件を指定してデータをフィルタリングする
- Order by ... データを並べ替える
- Return ... 結果を返す

次のXQueryのコードサンプルを見てみましょう。
```XQuery:FLWOR構文のサンプル
for $book in 
  <books>
    <book>
      <title>Book 1</title>
      <price>1000</price>
    </book>
    <book>
      <title>Book 2</title>
      <price>1500</price>
    </book>
    <book>
      <title>Book 3</title>
      <price>2000</price>
    </book>
  </books>/book
let $discount := $book/price * 0.1
where $book/price >= 1500
order by $book/price descending
return 
<book>
  <title>{string($book/title)}</title>
  <price>{string($book/price)}</price>
  <discounted-price>{($book/price - $discount)}</discounted-price>
</book>

//実行結果
<book>
  <title>Book 3</title>
  <price>2000</price>
  <discounted-price>1800</discounted-price>
</book>
<book>
  <title>Book 2</title>
  <price>1500</price>
  <discounted-price>1350</discounted-price>
</book>
```

このコードサンプルでは次の要件で書庫データ(books)を操作しています。
- For: 書庫データ(books)のbook要素を対象に反復処理します
- Let: 各book要素の値引き価格(10%)の計算結果をdiscount変数に代入します
- Where: priceが1500以上のデータだけを取得します
- Order by: priceの高い順に並べ替えます(descending)
- Return: 元のXMLデータに加えて値引き後価格を追加したXMLデータを返します

## XQuery と XPath

XQueryはXPathを組み込んでいるため、XQueryのクエリでXPathを使ってデータの選択が行われます。XPathは、XQueryの中で「データを選択するための手段」を提供し、XQueryはその後の操作や変換を行います。

様々なサンプルを次の記事で紹介しているので、参考にしていただければと思います。
- [XQuery+XPathサンプル](https://qiita.com/shunsuzu/private/f8cb01d4461c82d041e6)

## XQueryの動作確認をしたい場合

XQueryのコードは次のページでも動作確認ができます。

https://www.videlibri.de/cgi-bin/xidelcgi

例えば前述したXQueryのコードサンプルを画面右上にコピー&ペースト、出力結果をxml形式とすることで、コードの実行結果を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/b0211642-d067-7297-6ea2-a9ecbb817139.png)



## XQueryの実装で困った場合

生成AIに聞くと、とっても親切に教えてもらえます。また、生成AIに実装要件を伝えると、XQueryのサンプルコードも書いてくれますので、実装時に非常に強力な補助ツールになるでしょう。

例えば、1から10までの合計を取得する処理(等差数列の和)についてChatGPTに聞くと次のようにコードを教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/264e83fe-fff0-e8da-e997-24961da4f1b4.png)

## CUIコーディング vs GUIコーディング

[ジャンプステップによる実行制御](https://qiita.com/shunsuzu/private/07da81c4301cbe5bfe9a)でも等差数列の和を求める実装方法を確認していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/a0f5088b-f9d4-0f2f-83e8-b1b33c8d09c9.png)
この実装では等差数列の和を求めるために3つのステップを利用していましたが、XQueryを活用すると割り当てステップ1つで同じ処理を実装できます。

CUIコーディング(XQueryによるロジックの定義) と GUIコーディング(ステップによるロジックの定義)のメリット・デメリットを理解して、どちらのコーディングスタイルを選択するかをプロジェクトで検討しても良いかもしれませんね。

- CUIコーディングのメリット・デメリット
苦手な人もいるが、少ないパーツ(ステップ)で処理を実装できるため処理の全体像を把握しやすくなる場合がある
- GUIコーディングのメリット・デメリット
万人にわかりやすいが、パーツ(ステップ)が多くなり処理の全体像を把握しにくくなる場合がある

## 参考情報

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/items/3d1971ef6e3b993516aa)