XPath の簡単な紹介

MobileTogether は XPath を数式または式言語として使用しています。

Excel スプレッドシートの数式の書き方の知識がある場合、 MobileTogether 内の XPath 数式および式の書き方を簡単に学ぶことができます。いくつかの基本概念を理解するだけで十分です。スプレッドシートに数式を書き込む際 Excel の数式パレットが手助けをするように、MobileTogether の XPath ビルダーは XPath 式を簡単に構築する手助けをします。

XPath という名前の由来

XPath の [X] はXML、eXtensible Markup Language(エクステンシブル マークアップ ランゲージに由来します。 Path はパスのようなフォーマットを使用してデータの個々のコンポーネントを識別するという事実から来たものです。MobileTogether でアクセスするデータソースは [ページソース] の下の MobileTogether Designer ウィンドウの右横に小さなツリーのような構成で表されています。各ツリー構造は $XML1 または $DB1 のような名前で始まり、要素と呼ばれるデータの個々のコンポーネントがそのルートの後に記されます。これらの要素は論理的にネストされています。折りたたみ、または展開することにより全ての要素の下の構造がツリーとして表されています。MobileTogether の利点は基になるデータ (データベース、 XML ドキュメント、ウェブサービス、または他のデータソース) にかかわらず、すべてのデータが同じように表示され、アクセスすることができます。

XPath によりこれらのツリー構造をナビゲートし、データ要素をモバイルデバイスのスクリーンのユーザー インターフェイスのオブジェクトと関連付けることができるのです。コンピューターのハードドライブのファイル システム内のディレクトリ ツリーをナビゲートすることによく相似しています。Windows、Linux、 または MacOS に関わらず、ハードドライブにあるファイルはパスにより常にアクセスすることができます。例:

C:\Users\Spock\Documents\ScienceRecords (Windows)
/Users/Kirk/Documents/BeautifulAlienWomen (Linux/Mac)

XPath 式の例を比較してみましょう。

$DB1/salesdata/region/month/gadgets

ご覧のように同じアイデアなのです。コンピューターのハード ドライブ内のファイル システムをパス式を使用してナビゲートすることと同様に XPath を使用してデータツリー構造をナビゲートします。Linux と MacOS がディレクトリを区切ると同様に XPath は / (スラッシュ) を使用してパスの個別要素を区切ります。

興味深いことに、ディレクトリ パスとの類似は XPath の 2 つの共通の略記に通ずるものがあります: 単一のピリオド同様に . はファイル システムの現在のディレクトリを参照しており、は現在の XPath 内の要素を紹介しています。また、ファイル システムの親ディレクトリを参照するダブルピリオド .. は親ディレクトリの XPath 内の親要素を参照しています。

属性

もしデータソースが XML ドキュメントまたは Web サービスから返された XML データである場合、ツリー構造に含まれたデータは要素と属性の 2 つの種類に分類されます。要素は XML のコア データアイテムであり、ネストすることが可能であり、要素はツリー構造で子を持つことができます。対照的に属性は要素に添付されるシンプルなデータ値です。ページソースの下のツリー構造に = (等号) が付いた属性が名前の前に表示されます。これは、 XML ドキュメントでは属性は以下のように記されるからです。例: color=”green”。

XPath 式の属性を参照する場合、 @ (アットマーク)を名前の前に表記する必要があります:

$XML1/salesdata/region/@name

それ以外の場合、要素と属性は同様に扱うことができます。例えば、計算またはグラフで双方の値をチャートで使用することができますし、MobileTogether のデザインでユーザー インターフェイスのオブジェクトに割り当てることもできます。

述語

データ内でパスを要素に単純に指定するだけでは不十分な場合があります。グラフやユーザーにテーブルで紹介するための特定の条件に合うデータを選択するとします。

リレーショナル データベースで作業したことがある場合、 典型的な SQL ステートメントの WHERE 句と類似しています。特定の条件に一致するデータをデータベースから選択することができます。

XPath 内の同等のコンセプトは [述語] と呼ばれます。XPath 述語は選択条件を指定することができ、指定された条件に合う特定の要素を選択することができるのです。述語は論理テストにより入力され、 [] (角かっこ)で囲まれます。例えば:

$XML1/salesdata/region[@name=”East”]/Month

このステートメントの解釈は以下の通りです: $XML1 内のデータソースは salesdata 要素であり、子要素 region で属性名が East に当てはまる region を選択し、それぞれの子要素 Month を選択します。

演算子

XPath は全体式言語ですと記述されていますが、これはある特定のデータを選択できるだけでなく、データで新しい値を計算する典型的な数値演算を操作することができるのです。Excel の式で既存のデータにより新しい値が計算できる同様、MobileTogether の XPath 式で同じことができるのです。

モバイルインボイスソリューションを作成し、モバイルフォームでアイテムの総額を表示するとします。

$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price

データ構造は個別の個数と価格の要素があるとします(ユーザーにより編集可能)、その行の総額を* (アスタリスク)を使用して乗算を行います。

XPath の素晴らしい機能は、パス内の正しい場所で、掛け算を括弧を使用して XPath 内で行い、タイプする手間を省くことができることです。この短いバージョンが上記の式と同等の式なのです。

$DB1/sales/invoice/item/(quantity * price)

同様に、 use + (プラス) と - (マイナス)を 数学記号をして使用できます。しかし、割り算に関しては異なるシンボルを使用しなくてはなりません。/ (普通のスラッシュ)はパスの個別の要素を区切るために使用されているので、同じ記号を割り算には使用できません。ですから、 XPath 内の割り算の操作は、実数の場合 div を、整数の割り算の場合には idiv を使用します。(例:実数ではなく、整数を結果として希望する場合)。

演算子の周りにスペースをあけ、要素や属性の一部と見なされないようにすることは、よい、また時によっては必須の習慣です。- (マイナス)演算子の場合は特に当てはまります。

シーケンス

XPath とディレクトリ パスの重要な違いはディレクトリパス式は通常1つのファイルまたはディレクトリを識別しますが、 XPath 式は1つ以上のデータノードを参照することができます(例:要素または属性)。すべての 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 式

過去に他のプログラミング言語で作業経験がある場合、ループは現代言語で最もよく使用されるツールの1つであることをご存じでしょう。また、 XPath 式言語の最も重要な一部でもあります。

このシンプルなフォーム内で、 XPath 内の for 式により、for 式の中で直接定義される一時的ループ値を使用して、値またはノードのシーケンスを反復処理することができます。例えば、式

for $i in (1 から 10) return 2 * $i

は、基となるシーケンス (1 to 10) を反復処理し、変数 $i を使用し、 シーケンス内の各データポイントを 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 はループ変数であり、各アイテム要素を反復処理します。この式はインボイス内の各ラインの価格を含むシーケンスを返します。以下のアイテム要素がインボイスソースデータに含まれると仮定します:

<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、etc.)、文字列操作 (例、 concat、lower-case、contains、replace)、期間、日付、時間、集計された操作のシーケンス (例、count, sum, avg, min, max)などの多数の内蔵機能を搭載しています。必要なパラメーターの短い説明と情報つきの、使用可能な機能の便利なディレクトリを含むため MobileTogether の XPath ビルダーにより上記の機能を使用して、 XPath 式を書くことが簡単になりました。関数はロジカルグループで表示され、特定の使用ケースに必要な関数を簡単に見つけることができます。

if 式

式言語およびプログラミング言語では、特定の条件を満たすかにより、異なる方法を用いて、特定の結果を計算しなくてはなりません。この場合、指定されたテスト条件に基づいた代替結果を定義することができる if ステートメント、の登場です。

XPath 内では if ステートメントは以下のフォームを使用します:

if ( test-expression ) then expression else expression

テスト式が true または false を返すロジカルな XPath 式。

例えば、 MobileTogether でそのようなステートメントを使用して、ラベルのテキストの色やフィールドの編集をデータに含まれる数値に基づくように設定できます。編集フィールドに関連したデータソースからの要素があるとします。編集フィールドを選択して、優先タブに行き、テキスト色プロパティを選択します。カラー ピッカーから色を定義する代わりに、ツールバーの XPath アイコンをクリックして、入力フィールドのテキストの色を XPath 式を介して定義します。

if ( $MT_ControlValue >= 0 ) then "green" else "red"

MobileTogether 内蔵の変数の1つを使用して現在のコントロールを参照し、値がゼロよりも大きいかテストします。

テストの結果により、結果は緑または赤となり、ユーザー入力によりテキストの色はダイナミックに変換されます。

同様に、デバイスのスクリーンのサイズ、オペレーティングシステム、言語、その他の要素により $MT_から始まる多数の内蔵された変数を決定することができます。これらすべての内蔵されたグローバル変数は MobileTogether Designer プロジェクト メニュー内のグローバル変数ダイアログで確認することができます。

XQuery

XPath について歴史的理由の説明がなされましたが、 XML ベースの式言語として一般的に知られてからは 15 年程です。ですが、 XPath に加え MobileTogether は更にパワフルな XQuery 言語もサポートします。XQuery は XPath のスーパーセットです。有効な XPath 式のすべては有効な XQuery 式なのです。ですが、XQuery により強力な構造を追加しすることにより、更にできることが増え、XML ドキュメント全体を操作または組み立てることができるのです。

FLWOR 式

最も重要な XQuery 式はいわゆる FLWOR 式です。FLWOR は 「For-Let-Where-Order-Return」 の略称で通常「flower」として知られています。SQL SELECT と同様の機能があり、また、 FROM、 WHERE、 ORDER BYなどの類似した句を持ちます。プレーンな XPath と比べ、 FLWOR 式により、 XML とデータベース データを効率よく、またパワフルにクエリすることができます。また、XQuery の基礎を形成します。

XPath についてのディスカッションで式については既に述べられており、 FLWOR 式についても身近な解説となるでしょう。RETURN 句についても同様です。ですが、コンストラクターを使用し、始めから XML ツリーを作成することにより XQuery は RETURN 句の柔軟性を拡張します。基本的に、以前同様、ループの各アイテム内の RETURN 句は評価されます。また、以下の例で示されるように、 XML サブツリー全体を構築することができ、以下に例が表示されています。

FLWOR 式の LET 句により後ほど結果を構築するために使用できる追加の値を定義できることです。同じデータソースからまたは、他のデータソースから得ることができます。しかし、ループ変数を使用して他のソースから特定の要素を選択することができます。

例えば、データソースが組織内の他の部署の情報を含み、他のデータソースが社員の情報を含んでいる場合、特定の部署の組み合わせからの社員を選択する FLWOR 式の始まりとなります。

for $d in $DEPARTMENTS/depts/deptno
Let $e := $EMPLOYEES/emps/emp[deptno = $d]

XPath 式の述語の使用と同様、 WHERE 句 により特定の条件をベースにデータをフィルターすることが可能となります。例えば、社員数をベースに部署をフィルターすることに使用することができます。

for $d in $DEPARTMENTS/depts/deptno
Let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10

最後に、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 を介して、選択されたデータをテストおよびデバッグすることが可能であり、他のアプローチよりも迅速にパワフルなモバイルアプリを構築できます。

要約

MobileTogether を使用してデータと作業を開始するため、 XPath と XQuery の最も重要なコンセプトの簡単な紹介をこのドキュメントで行いました。特定のデータアイテムのニーズに応じてモバイルワーク フローの中でパワフルなデータ選択を作成、データの正確なチャート作成、およびモバイルソリューションのユーザーインターフェイスのカスタム化を可能にするための、 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 に関連する質問は以下の MobileTogether サポートフォーラムに問い合わせてください http://support.mobiletogether.com/