MobileTogetherは、数式や式を記述する際にXPathをその言語として使用します。
Excelのスプレッドシートで数式を記述する方法を知っている方なら、MobileTogetherでXPathの数式や式を記述する方法も簡単に習得できます。数個の基本的な概念を理解するだけで済みます。MobileTogetherのXPathエディターは、Excelの数式エディターがスプレッドシートでの数式作成をサポートするように、XPath式の構築を容易にします。
XPathにおける「X」は、その起源であるXML(拡張マークアップ言語)に由来し、「Path(パス)」は、データの一部を特定するために、パスのような形式を使用することに由来します。MobileTogetherでアクセスするすべてのデータソースは、MobileTogetherデザイナーウィンドウの右側にある「ページソース」の下に、小さなツリー構造として表現されます。各ツリー構造は、名前(例:$XML1、$DB1)を持つルートから始まり、その下に個々のデータ要素(要素と呼ばれる)が配置されます。これらの要素は、論理的に階層化されており、各要素を折りたたんで展開することで、その下に何があるかを確認できるツリー構造として表現するのが最適です。そして、MobileTogetherの優れた点は、データのソースがデータベース、XMLドキュメント、Webサービス、またはその他のデータソースであっても、すべて同じように表示され、同じ方法でアクセスできることです。
XPathを使用することで、これらのツリー構造をたどり、モバイルデバイスの画面上のユーザーインターフェースオブジェクトと、あなたのデータ要素を関連付けることができます。これは、コンピュータのハードドライブ上のファイルシステムで、ディレクトリツリーを操作するのと非常に似ています。Windows、Linux、macOSのいずれを使用しているかに関わらず、ハードドライブ上のファイルは、常にパスを使ってアクセスできます。例えば:
C:\Users\Spock\Documents\ScienceRecords (Windows)
/Users/Kirk/Documents/BeautifulAlienWomen (Linux/Mac)
それでは、比較のために、XPath式の具体的な例を見ていきましょう。
$DB1/salesdata/region/month/gadgetsご覧の通り、これは全く同じ考え方です。XPathは、コンピュータのハードドライブ上のファイルシステムを操作する際にパス式を使用するのと同じように、データツリー構造を操作するために使用されます。XPathは、LinuxやmacOSがディレクトリを区切るために使用するスラッシュ(/)と同様に、パス上の個々の要素を区切るためにスラッシュ(/)を使用します。
興味深いことに、このディレクトリパスとのアナロジーは、XPathで非常に一般的な2つの省略形にも当てはまります。ファイルシステムにおいて、単一のピリオド「.」が現在のディレクトリを指すように、XPathにおける「.」も現在の要素を指します。同様に、ファイルシステムにおいて親ディレクトリを指す二重のピリオド「..」も、XPathにおいては親要素を指します。
もしデータソースがXMLドキュメントである場合、またはウェブサービスから返されるXMLデータである場合、そのツリー構造に含まれるデータは、主に2つの要素で構成されます。それは、要素と属性です。XMLにおける要素は、データの主要な部分であり、入れ子構造を持つことができます。つまり、ある要素はツリー構造の中で子要素を持つことができます。一方、属性は、要素に付随する単純なデータ値です。ページソースのツリー構造では、属性が名前の前に"="(等号)で表示されていることがわかります。これは、XMLドキュメントにおいて、属性が例えば "color="green"" のように記述されるためです。
XPath式で属性を参照する場合、属性名に「@」(アットマーク)を必ず付記する必要があります。
$XML1/salesdata/region/@nameそれ以外の場合、要素や属性についても同様のことが可能です。つまり、計算に使用したり、グラフで値を表示したりすることができます。また、MobileTogetherのデザインにおいて、これらの要素や属性をユーザーインターフェースのオブジェクトに割り当てることも可能です。
データ内の特定の要素へのパスを指定するだけでは、必ずしも十分ではありません。多くの場合、特定の条件に合致するデータを選択し、例えばグラフで表示したり、テーブル形式でユーザーに提示したりすることが目的となります。
もし、これまでリレーショナルデータベースを扱ったことがあるなら、これはSQL文における一般的なWHERE句に相当します。これにより、データベースの中から、特定の条件に合致するデータを選択することができます。
XPath における同様の概念は「述語 (Predicate)」と呼ばれます。XPath の述語を使用すると、特定の条件に合致する要素のみを選択するための条件を指定できます。述語は、角括弧 [] で囲まれた論理式として記述されます。例えば:
$XML1/salesdata/region[@name=”East”]/Monthこの記述の解釈は以下の通りです。まず、XML1というデータソースにおいて、"salesdata"という要素に移動します。次に、その子要素である"region"に移動し、属性名が"East"と一致する地域のみを選択します。そして、それぞれの地域に対応する子要素である"Month"を選択します。
冒頭で述べたように、XPathは完全な表現言語です。つまり、特定のデータを選択するだけでなく、データに対して一般的な数学的な演算を行い、新しい値を計算することも可能です。Excelの数式が既存のデータから新しい値を計算できるように、MobileTogetherでもXPathの式を使って、全く同じことができます。
例えば、モバイル請求システムを開発しており、モバイルフォーム上で、各項目ごとの合計金額を表示したいとします。
$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price
もし、データ構造において数量と価格がそれぞれ別の要素として定義されており、それらがユーザーによって編集可能である場合、上記の乗算(* を使用)を用いて、その行項目全体の合計金額を簡単に計算できます。
XPathの非常に優れた機能の一つは、パスの適切な箇所で括弧を使用して乗算を直接XPath内で実行することで、多くのタイピングを省略できることです。したがって、上記の式と等価な、より簡潔な表現は以下のようになります。
$DB1/sales/invoice/item/(quantity * price)同様に、"+" (プラス) と "-" (マイナス) を数学的な演算子として使用できます。しかし、除算には別の記号を使用する必要があります。なぜなら、XPathのパス内で個々の要素を区切るためにすでに "/" (スラッシュ) を使用しているため、同じ記号を除算に使用することはできません。したがって、XPathにおける除算演算子は、実数除算には "div"、整数除算には "idiv" という単語が使用されます(つまり、結果を実数ではなく、整数として扱いたい場合に "idiv" を使用します)。
また、演算子(operator)の周りにスペースを入れることは、良い習慣であり、場合によっては不可欠です。これは、演算子が要素名や属性名の一部と誤認されるのを防ぐためです。特に、"-"(マイナス)演算子については、この点に注意が必要です。
XPathとディレクトリパスの重要な違いの一つは、ディレクトリパスが通常、特定のファイルやディレクトリを一つだけ識別するのに対し、XPath式は複数のデータノード(要素または属性)を参照できる点です。実際、XPath式は常に、結果としてノードのシーケンスを返します。
これは、ほとんどのデータベースが、構造が似たデータ行を多く含んでいること、そしてほとんどのXMLドキュメントが、本質的に同じ名前を持つ要素の系列を含み、同様の構造を持っていることを考慮すると、理解しやすくなります。XPathは、開発者がこのようなデータセットを容易に扱えるように設計されており、一度に一連のノード全体にアクセスできることは、次の数章で見ていくように、非常に大きな利点をもたらします。
同時に、XPath式において、特定のシーケンスを明示的に定義する必要が生じる場合があります。その場合、以下の形式で値を列挙することで定義を行います。
(1, 2, 3, 4, 5)
シーケンスは順序付けされており、したがって、上記のシーケンスは (3, 5, 2, 4, 1) というシーケンスとは明確に異なります。シーケンスには、データ内のノードだけでなく、定数数値や定数文字列を含めることもできます。
例えば、文字列の組み合わせの例としては、以下のようなものが考えられます。
("a", "b", "c", "d", "e")最後に、そして非常に重要な点として、範囲演算子を使用して、数値の特定の順序を指定することができます。
(1 to 5)
これは (1, 2, 3, 4, 5) という数列と同等です。ご覧の通り、この範囲指定演算子を使用することで、手作業で列挙するには手間がかかりすぎるような、数値の数列を迅速に構築することができます。
過去に他のプログラミング言語を使用したことがある方であれば、`for`ループが、多くの現代的な言語で何らかの形で存在する、一般的なツールであることをご存知でしょう。また、`for`ループはXPath式言語においても、不可欠な要素です。
XPathにおける`for`式は、最もシンプルな形では、一時的なループ変数を使用して、一連の値やノードを反復処理することができます。このループ変数は、`for`式の中で直接定義されます。例えば、以下のような式が考えられます。
for $i in (1 to 10) return 2 * $i
このコードは、変数 `$i` を使用して元の数列 (1から10) を繰り返し処理し、各データポイントに対して `2 * $i` を計算することで、数列 (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) を生成します。
XPath式は、ノードのシーケンスを返すことができることがわかっているので、`for`式を使って、それらのノードを一つずつ処理し、何らかの数学的な演算を行うことも可能です。例えば、請求書内のすべての明細項目を処理し、それぞれの明細項目に対応する金額を計算する場合、次のような式を使用できます。
for $x in $DB1/sales/invoice/item return $x/price * $x/quantity
この場合、`x` がループ変数となり、各項目要素を順番に処理します。そして、この式は、請求書に含まれる各項目の金額を含む数列を返します。ここでは、請求書のデータソースに以下の2つの項目があると仮定します。
<item><quantity>5</quantity>
<price>12.50</price>
</item><item><quantity>3</quantity>
<price>27.85</price>
</item>次に、以前のXPath式を実行すると、(62.5, 83.55)という値のシーケンスが返されます。これらの値は、それぞれ請求書上の各項目に対応する金額です。
XPathにおける関数は、Excelの数式や他の多くのプログラミング言語における関数と全く同じように動作します。関数は、その名前を呼び出し、括弧()の中に一連の関数パラメータを渡すことで使用します。例えば、数列 (3, 9, 14) の合計を求めるには、次のように記述します。
sum( (3, 9, 14) )これにより、結果は26になります。注意点として、この場合、外側の括弧は`sum()`関数への呼び出しの一部であり、一方、内側の括弧は、関数に単一のパラメータとして渡される数列の一部です。
同様に、前の例で示した請求書全体の金額は、すべての明細項目を合計することで計算できます。
sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )
これは非常に役立つことがあります。例えば、モバイルアプリケーション内でインタラクティブなフォームを構築する場合、ユーザーがフォームに入力するにつれて動的に変化する合計値などのデータ値を表示することができます。
XPathには、数値(例:round、abs、floorなど)、文字列操作(例:concat、小文字変換、contains、replace)、期間、日付、時刻に関する多数の組み込み関数が用意されています。また、シーケンスに対する集計処理(例:count、sum、avg、min、max)も可能です。MobileTogetherのXPathビルダーでは、これらの関数を使ってXPath式を簡単に記述できます。なぜなら、利用可能なすべての関数が、簡単な説明と必要なパラメータに関する情報とともに、便利なディレクトリ形式で提供されているからです。関数は論理的なグループに分類されているため、特定の用途に必要な関数を簡単に見つけることができます。
プログラミング言語、また表現言語においても、特定の条件が満たされるかどうかによって、ある結果を計算する異なる方法を選択する必要がある場合があります。そこで、特定の条件に基づいて異なる結果を定義できる「if文」が役立ちます。このif文を使用することで、指定した条件に基づいて処理を分岐させることができます。
XPathにおけるif文は、以下の形式で記述されます。
if ( test-expression ) then expression else expression
ここで、"test-expression"は、真または偽を返す論理的なXPath式です。
例えば、MobileTogetherにおいて、あるラベルや入力フィールドのテキストの色を、データに含まれる数値に応じて変化させるために、このような記述を使用できます。 あるデータソースから取得した要素が、入力フィールドに関連付けられているとします。 その入力フィールドを選択し、プロパティタブに移動します。 そこでは、テキストカラーのプロパティを選択できます。 カラーピッカーで色を指定する代わりに、ツールバーにあるXPathアイコンをクリックし、XPath式を使って、その入力フィールドのテキストの色を定義することができます。
if ( $MT_ControlValue >= 0 ) then "green" else "red"
ここでは、MobileTogetherに組み込まれている変数の一つを使用して、現在のコントロールを参照し、その値がゼロ以上であるかどうかを検証しています。
そのテストの結果によって、「グリーン」または「レッド」のいずれかの結果が表示され、ユーザーの入力に応じてテキストの色が動的に変化します。
同様に、デバイスの画面サイズ、オペレーティングシステム、言語など、さまざまな要素に基づいて判断を行うことができる、"$MT_"で始まる多くの組み込み変数があります。これらの組み込みグローバル変数は、MobileTogether Designerのプロジェクトメニューにある「グローバル変数」ダイアログで確認できます。
これまでの議論では、主にXPathについて話してきましたが、これは歴史的な理由によるものです。XPathは、より一般的に知られているXMLベースの式言語であり、15年もの間利用されてきました。しかし、XPathに加えて、MobileTogetherはより強力なXQuery言語もサポートしています。XQueryは、XPathの真の拡張版であり、つまり、有効なXPathのすべての式は、有効なXQueryの式でもあります。ただし、XQueryは、より多くの機能を実現し、XMLドキュメント全体をリアルタイムで操作したり構築したりできる、いくつかの強力な機能を追加しています。
最も重要なXQueryの式は、いわゆるFLWOR式です。FLWORは、「For-Let-Where-Order-Return」の略であり、一般的に「フラワー」と発音されます。これは、FROM、WHERE、ORDER BYなど、同様の要素を持つSQLのSELECT文と機能的に同等です。FLWOR式を使用することで、単純なXPath式よりも、XMLやデータベースのデータをより効率的かつ強力にクエリすることができます。そして、FLWOR式はXQueryの中核をなすものです。
XPathについて以前に議論した際、すでに「for」の部分に触れていますので、FLWOR式におけるこの部分は馴染み深いものかと思います。同様に、「return」句も、以前の「for」式で見ています。しかし、XQueryは「return」句の柔軟性を大幅に拡張しており、コンストラクタを使用することで、XMLツリー全体を最初から作成することが可能です。基本的に、以前と同様に、「return」句は「for」ループ内の各項目に対して評価されますが、以前は単一の値のシーケンスを生成するだけでしたが、今ではXMLのサブツリー全体を構築できるようになりました。以下に示すいくつかの例で、その様子を確認しましょう。
FLWOR式における`let`句の目的は、後で結果を構築するために使用できる追加の変数を定義することです。これらの変数は、同じデータソースから取得することも、別のデータソースから取得することも可能です。例えば、ループ変数を使用して、別のデータソースから特定の要素を選択することができます。
例えば、あるデータソースが組織内の部署に関する情報を含み、別のデータソースが従業員に関する情報を含んでいる場合、以下のようなFLWOR式が、特定の部署に所属する従業員を選択するための始まりとなる可能性があります。
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
…
`WHERE` 句を使用することで、特定の条件に基づいてデータを絞り込むことができます。これは、以前にXPath式で述語を使用していたのと同様の仕組みです。例えば、従業員数に基づいて部署を絞り込むことができます。
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
…
最後に、ORDER BY句を使用することで、結果を任意の基準で並べ替えることができ、これは特に、新しいXMLドキュメントを生成する際に非常に役立ちます。
それでは、先ほど述べた部署と従業員に関する2つのデータソースを用いて、FLWOR式全体を組み立ててみましょう。例えば、従業員数が10人以上の部署について、従業員数と平均給与の集計情報を表示する新しいデータテーブルを生成することができます。このデータテーブルをモバイルアプリケーションで表示することで、より詳細な情報を提供できます。
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
order by avg($e/salary) descending
return<big-dept> { $d,<headcount>{count($e)}</headcount>,
<avgsal>{avg($e/salary)}</avgsal>
}
</big-dept>別の例として、以前に収集した、明細項目を含むモバイル請求書のデータを利用して、特定の日付以降の複数の請求書を処理し、それぞれの合計金額を計算することができます。そして、その結果を合計金額の大きい順に並べ替えた表を作成し、最も大きい金額の請求書から最も小さい金額の請求書へと表示することができます。
for $inv in $DB1/sales/invoice
let $total := sum (for $x in item return $x/price * $x/quantity)
where $inv/date >= "2014-01-01"
order by $total descending
return <invtotal>{ $total }</invtotal>
ご覧の通り、これらのXQuery式は、以前にXPathだけでは実現できなかった、はるかに高い柔軟性と強力な機能を持っています。しかし、その強力さが増すということは、複雑さも増すことを意味します。そのため、XQueryを完全に習得するには、ある程度の時間が必要になるでしょう。
同時に、MobileTogetherに組み込まれているXPathおよびXQueryの構築・評価機能は、適切な式を作成し、お客様のデータを使ってそれらをテストする際に、非常に役立ちます。さらに、MobileTogether Designer上でモバイルアプリケーションを直接実行できる強力なシミュレーターと組み合わせることで、XPathやXQueryを使ったデータ選択のテストとデバッグを容易に行うことができ、他の方法と比較して、はるかに迅速に高性能なモバイルアプリケーションを開発できます。
このドキュメントでは、XPathとXQueryの主要な概念について、初心者の方にも分かりやすいように解説しています。MobileTogetherでデータ処理を始めるにあたり、XPathの基本的な表現方法や、より高度なXQueryの機能について触れています。これにより、モバイルアプリケーションのワークフローにおいて、強力なデータ抽出、正確なデータ可視化、そして特定のデータ項目に応じてモバイルソリューションのユーザーインターフェースをカスタマイズすることが可能になります。
ただし、このドキュメントはあくまでも出発点であり、これらの言語のすべての側面を網羅した完全なチュートリアルや詳細な解説を提供するものではありません。初心者から上級者まで、幅広いレベルの方に適した、包括的な無料オンラインXPathトレーニングコースで、さらに詳しく学ぶことができます。
MobileTogetherは、XPath 3.0およびXQuery 3.0の機能を完全にサポートしています。XPathやXQueryといった国際標準を使用する利点は、多くの開発者が過去にXML、XSLT、またはXMLスキーマを扱った際にXPathを学習している可能性があることです。そのため、MobileTogetherでその知識を再利用できることは、彼らにとって大きなメリットとなります。また、XPath 1.0または2.0の知識を3.0にアップデートするプロセスは非常に簡単です。
また、XPathとXQueryは、特定の企業が独自に開発した言語ではなく、W3Cが開発した標準規格であるため、これらの標準を学ぶことは、他の分野においても役立つでしょう。
XPath 3.0 および XQuery 3.0 の詳細な仕様については、以下の技術仕様書をご参照ください。
最後に、MobileTogetherでXPathとXQueryを使用することで、必要に応じて、XMLSpyを使ってより複雑なXPathやXQueryの式を簡単に試作、開発、デバッグすることができます。XMLSpyは、パフォーマンス最適化のためのプロファイラを含む、XPath評価機能とXQueryデバッガーをフル機能で提供します。
XPath 3.0およびXQuery 3.0についてさらに詳しく知りたい場合は、Altovaのオンライントレーニングおよびドキュメントページをご参照ください。また、XPathのすべての演算子と関数を解説し、それらを実装する方法の例を示すXPathリファレンスも提供しています。最後に、XPathおよびXQueryに関するご質問は、https://support.mobiletogether.com/のMobileTogetherサポートフォーラムでお気軽にお問い合わせください。