第10章

exteNd Composerでのカスタムスクリプト作成およびXPathロジック

Novell exteNd Composerには、Composerアプリケーションの機能をさまざまな方法で拡張できるオンボードのEMCAScriptインタプリタが組み込まれています。たとえば、スクリプトを作成して、次の処理を実行できます。

XPath言語でも、Composerコンポーネントでカスタムロジックを開発できます。XPath仕様には、XMLデータのフィルタ、修飾、集約、または配置、あるいはこれらすべてのために使用できる20以上の定義済み関数が含まれています。

この章では、ComposerにおけるカスタムECMAScriptまたはXPathロジック、あるいはその両方の使用に適用できる手法と機能をいくつか説明します。また、さまざまなW3C標準と、XPathおよびECMAScriptとの関係についても説明します。

 
Top of page

ECMAScriptとは

ECMAScriptは、カスタムロジックを使用できるようにすることによって多様なホスト環境(Webブラウザ、エディタ、IDEなど)の機能を拡張するための軽量型オブジェクト指向スクリプト言語です。ECMAScriptは、exteNd Composerをはじめとするホストプログラムの既存の機能を補完または拡張するためのものです。Webブラウザの環境では、ECMAScriptは、多くの場合、JavaScriptまたはJScriptと呼ばれます。

ECMAScriptは、次のような理由から特にJavaホスト環境に適しています。

  1. Javaによく似た構文を使用するオブジェクト指向言語である

  2. ECMAScriptで作成したスクリプトから、Javaのコンストラクタとメソッドを直接コールできる

ECMAScriptの拡張性、強力な文字列処理ツール(正規表現を含む)、DOMバインディング、およびJavaとのブリッジを提供する機能により、ECMAScriptは、exteNd Composerによって使用されるプログラミング構成要素と標準を拡張するための理想的な言語となります。

注記:   ECMAScriptに関する詳細は、次に示すEuropean Computer Manufacturers Association (ECMA)のWebサイトで参照できます。http://www.ecma.ch/

 
Top of page

ECMAScriptが備える機能

スクリプトを使用すると、微調整したカスタムロジックをアクションモデルに組み込むことができるだけでなく、データ操作の柔軟性も大きく増します。これは、ComposerのECMAScript拡張には、DOMおよびXPathに関連するさまざまなオブジェクトとメソッドが用意されているためです。また、拡張可能な言語として、ユーザ定義カスタムオブジェクトをECMAScript内でその場で作成したり、Composerのコンポーネントやサービスで使用したりすることもできます。

ECMAScriptの有用性は、メモリ内DOMを扱う場合に特に明白です。Composerでは、XMLドキュメントは、W3C DOM Level 2仕様に基づいて、メモリ内オブジェクトとして作成されます。DOM-2仕様では、DOMツリーの内容への容易なアクセスを提供するさまざまなメソッドやプロパティとともに、ECMAScriptバインディングが定義されています(http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.htmlを参照)。Composerの標準のDOM (Input、Input1、Input(n)、Temp、およびOutput)は、Composer内でECMAScriptによって認識されるオブジェクトで、DOMに適用される、W3Cで定義されたECMAScript拡張にComposerからアクセスできます。

ECMAScriptは、XPathなどの他の式言語とのブリッジも提供します。 Composerの場合は、これにより、Novellが提供するメソッドXPath()をDOMで使用して、ドキュメント構造内のさまざまな要素のアドレスを指定できます。

ComposerのECMAScriptバインディングのもう1つの便利な面は、ファイルI/O拡張(コア言語の一部ではありません)が含まれるところです。カスタムスクリプトを使用して、スクラッチファイルを簡単に読み書きしたり、情報をディスクに保存したり、他の一般的なファイルアクセスタスクを実行したりできます。

ComposerのECMAScriptバインディングには、プログラムからJDBCを通じてデータベースにアクセスできるようにするデータベース拡張も含まれます。SQLステートメントを文字列として渡し、接続を定義できる任意のデータベースに対して実行できます。

 
Top of page

Composerのユーザインタフェースでのスクリプトの表示方法

このガイド全体で説明するように、Composerでは、コンポーネントエディタユーザインタフェースの多くの部分から、ECMAScriptへアクセスできるようになっています。最も一般的なアクセスの方法は、式ビルダを使用する方法です。次のアイコンが表示されていれば、いつでも式ビルダに移動できます。

10ExpressionEditorIcon

このアイコンは、[マップアクション]ダイアログボックスや[接続リソース]ダイアログボックスなど、Composerの多くのダイアログボックスに表示されます。このアイコンをクリックすると、次のようなダイアログボックスが表示されます。

10ExprBuilder

[式ビルダ]ダイアログボックスでは、最上部のペイン(すべてサイズを変更可能)に、使用可能なオブジェクト、メソッド、およびプロパティの選択リストと、ECMAScriptステートメントの作成に役立つロールオーバのツールヒントが提供されます。選択ツリーで任意の項目をダブルクリックすると、ウィンドウ下部の小さな編集ペインに、対応するECMAScriptステートメントが表示されます。上の例では、PROJECTに対応するDOM選択ツリーを[変数]ペインで開き、次の位置にあるノードをダブルクリックしています。

  USERCONFIG/PROJECT_CONFIG/DESIGNER_EMULATION_MODE

PROJECT DOM内のこのノードのコンテンツにアクセスできるECMAScript式が、自動的に編集ペインに表示されます。

ウィンドウのボタンバーには、[検証]ボタンがあります。このボタンをクリックすると、ECMAScriptインタプリタによって式の構文がリアルタイムでチェックされます。ECMAScriptの構文に関する問題がある場合は、ただちにエラーダイアログボックスが表示され、必要に応じて、式を編集して再検証できます(ただし、検証はオプションです)。

注記:   検証処理では、式は実行されず、構文のチェックのみが行われます。

ダイナミックなパラメータ値の式

通常、Composerの各アクションには、アクションの実行に使用する1つまたは複数のパラメータが必要です。可能な場合、これらのパラメータの代わりにECMAScript式を使用できます。静的な文字列、式、またはセミコロンで区切った一連の式を入力できます。式はランタイム時に評価されるため、実行時までパラメータ値の選択を延長できます。 このようなパラメータ値の遅延バインディングは、入力値が事前にわからない場合に重要です。

例: メールの送信アクションのRecipientパラメータに対して、静的な文字列をハードコードするよう選択できます。ただし、ECMAScriptを使用して、着信したXMLドキュメント内にあるデータから電子メールアドレスを作成し、ランタイム時の情報に基づいてカスタマイズできる、データ駆動型の柔軟なアクションを作成することもできます。

Composerのほとんどのアクションでは、パラメータ値としてECMAScript式を受け付けます。たいていの場合、XPath式も受け付けられます。通常は、[XPath]および[式]というラベルの付いた2つのラジオボタンから選択できます。ECMAScript式ビルダにアクセスするには、[式]ラジオボタンをオンにして、パラメータ値が表示されるテキストフィールドの横にある小さな[式ビルダ]アイコンをクリックします。

カスタムスクリプトライブラリ

ECMAScriptは、カスタムスクリプトと呼ぶ一般的なリソースとしてもComposerに統合されています。カスタムスクリプトリソースは、エディタ内にあるコマンドライン評価プログラムで実行およびデバッグできるカスタムECMAScript関数を作成するための編集環境を提供します。スクリプトエディタは、サンプルXMLドキュメント(DOMツリー)へのアクセスも提供しており、カスタムJavaコードとのブリッジとして機能するスクリプトを容易に作成できるよう、Javaクラスブラウザを備えています。 カスタムスクリプトのライブラリをカスタムスクリプトリソースとして保存できます。ライブラリは、Composerのナビゲーションフレームのインスタンスペインに表示されます。 また、カスタム関数をカスタムスクリプトリソースに組み込むと、[式ビルダ]ダイアログボックスのすべての選択リストに自動的に表示されます。

カスタムスクリプトリソースとスクリプトエディタの詳細については、319XSDリソースについてを参照してください。

関数アクション

ECMAScriptの機能をComposerを表示するもう1つの方法は、すべてのコンポーネントエディタで使用可能なコアアクションの1つである関数アクションを使用する方法です。関数アクションをアクションモデルの任意の場所に挿入して、変数の初期化、カスタム関数のコールなどを行うことができます。関数アクションの最も便利な使い方の1つは、デバッグ支援です。組み込みのalert()関数を任意の文字列引数(DOMノードの内容など)とともにコールして、1つのアクションまたは複数のアクションのブロックの前後でパラメータ値の内容を検査できます。alert()関数により、該当する文字列を示すダイアログボックスが表示されます。

注記:   alert()の呼び出しを展開の前に無効にしておく必要があることに注意してください。これは完全に設計時メソッドであるため、サーバ環境には適用できません。

関数アクションの作成および使用の方法については、158関数アクションを参照してください。


 
Top of page

XPathからECMAScriptへのアクセス

一部のダイアログボックスフィールドには、XPath式が必要です。 ただし、一部のインスタンスでは、XPath上でのECMAScriptの大幅な速効性を好んだり、ロジックの要件をXPathが関連する組み込み関数の制限付きのセットに入らないことがあります。このような場合でも、ECMAScriptを引き続き、次のような方法で使用できます。userfuncネームスペース経由、XPathを必要とするすべてのフィールドでECMAScriptにアクセスできるようにする。

たとえば、getTotal()と呼ばれるカスタムECMAScript関数を独自に定義したとします。

  function getTotal(a,b) {
      return Number(a) + Number(b);
  }

この関数はプロジェクトのカスタムスクリプトリソース、または関数Actionの中のいずれかで定義できます。

ORDER/SUBTOTALおよびORDER/TAXによりこの関数をXPathステートメントから呼び出すことができると仮定します。XPathは以下のように書きます。

  userfunc:getTotal(ORDER/SUBTOTAL,ORDER/TAX)

この呼び出しは、[XMLマップアクション]ダイアログで次のように表示されます。

10userfunc

 
Top of page

XPath Access from ECMAScript

XPathからECMAScript関数に達することができるように、ノードオブジェクト、ノードデータ値などをECMAScript経由で取得することもできます。ComposerはDOM要素の操作のために種々のECMAScript拡張を備えています(後で詳しく説明します)。これらの拡張が最も頻繁に使用されるのは、XPath() メソッドで、単独の引数としてXPath形式のパス文字列を使用します。

  var taxNode = Input.XPath(\x81 gORDER/TAX\x81 h);
  var taxAmt = taxNode.toString() * 1;

DOMルートのペアレントであるXPath()メソッド(この場合はInput)は、常にノード値ではなく、ノードオブジェクトを返します。 ノードのデータ値を取得するためには、コア言語ECMAScriptメソッド toString()をそれに適用します。 結果文字列の値が数値として使用される場合、ECMAScriptのNumber()コンストラクタにそれをラップするか、1を乗じることにより、数値にキャストします(例を参照)。

注記:   XPath()メソッドを使用するときの最も一般的なエラーは、実際はノードリストを返すときに、データ値(文字列、数値など)が返されると仮定してしまうことです。 返されたノードリストの先頭ノードオブジェクトからデータ値を取得するときは、item(0).toString()と記述するようにしてください。

 
Top of page

カスタムスクリプト関数と変数の有効範囲

カスタムスクリプトリソースに保存された関数は、アクションモデルのどこででも、プロジェクトのすべてのコンポーネントまたはサービスで使用できます。 (ただし、カスタム関数を作成した後で、コンポーネントで関数を使用できるようにするには関連付けられたカスタムスクリプトリソースを保存しなければなりません。)

カスタムスクリプトリソース内のグローバル変数(すなわち、カスタム関数の外部で宣言された変数)は、変数を使用するカスタムスクリプトリソース関数にのみ表示されます。言い換えると、変数を宣言する場合、myFunctions内の唯一の関数であるmyFunctionsというカスタムリソースの中のmyVariableは、myVariableを表示し、使用することができます。

コンポーネントのアクションモデル内で宣言された変数は、コンポーネントにスコープされます。すなわち、(関数アクションの)アクションモデルの先頭で宣言された変数は、宣言の任意のアクションダウンストリームに表示され、コンポーネントの寿命中、有効ですが、外部コンポーネントでは変数を使用できません。

変数の「サービス間」スコープを達成するには、344Component (xObject)という節で説明されているputSessionValue()getSessionValue()メソッドを使用します。

 
Top of page

ECMAScriptの例の参照

任意のカスタム関数の本文の中では、DOMをECMAScriptオブジェクトとして取り扱い、toString()などのDOMを文字列テキストとして書き出すなどのオブジェクトに対する有効なメソッドを呼び出すことができます。

注記:   カスタム関数に加えて、すべての標準的な組み込みECMAScriptオブジェクト(アレイ、ブール値、日付、関数、数値演算、オブジェクト、数値、RegExp、文字列、およびトップレベルグローバルオブジェクト)、およびメソッドとプロパティを式からアクセスすることができます。

関数アクションで使用するカスタムECMAScript式の例は以下のとおりです。

  var onHand = Input.XPath("INVENTORYSTATUS/ONHAND");
  if (Number(onHand) < 10)
     Output.XPath("PRODUCTRESPONSE/INVENTORYSTATUS") =
  	         "Time to reorder";

このスクリプトでは、INVENTORYSTATUS/ONHAND要素ノードの入力DOMの値をチェックし、10未満の場合、「Time to reorder」という文字列を要素PRODUCTRESPONSE/INVENTORYSTATUSの出力DOMにマップします。

ECMAScriptの記述方法に従うと、ローカル変数onHandの宣言にはデータ型ラベルを含める必要はありません。ただし、onHandから呼び出される値は文字列であることが頻繁にあります。その文字列を数字にキャストするためには、それにコアECMAScript Number()関数を適用する必要があります。その際に、条件の中で小なり演算子を使用することができます。

onHandが最終的に数値にキャストできない値(空の文字列など)を割り当てられる可能性はもちろんあります。その場合、Number()は問題のある値NaNを返し、条件式に例外を生成させることになります。例外を生成せずにこの可能性を取り扱うためには、以下のように処理することができます。

  if ( !isNaN(Number(onHand) ) ) ?
      if (Number(onHand) < 10)
          [ここにコードを入力します]

isNaN()メソッドは「数値であること」をチェックするECMAScript言語のコアメソッドです。

isNaN()戦術の代わりに、try/catchステートメントに例外コードをラップして、catchブロックの例外を処理することができます。(try/catchの作成は、ECMAScriptによりサポートされています。)

注記:   その他のECMAScriptの例については、「Expressions」というComposerプロジェクトのサンプルに含まれている任意のカスタムスクリプトリソースを開いて(またはプロジェクトにインポートして)ください。

 
Top of page

パフォーマンスについて

ECMAScriptは解釈済みの言語で、実行前に式のスクリプトの各行が解析され、同義のJavaに変換されなければならないことを意味します。これにより、コードに対して著しいオーバーヘッドがかかるため、純粋なJavaに比べてスクリプトの実行速度が全体的に遅くなります。ECMAScriptをコンポーネントやサービスで広く使用する前に、パフォーマンスに影響が生じる可能性があることも考慮に入れる必要があります。

以下のガイドラインは、コンポーネントやサービスで最適のパフォーマンスを達成する上で役立ちます。

パフォーマンスの改善には、常に良い実装が前提になります。つまり、正しいアルゴリズムを選択し、変数の再使用に注意するなどです。実行速度の遅い言語で書かれた良いコードは、実行速度の速い不良なコードで書かれたコードよりも効率が良い場合がよくあります。Javaで書いたとしても、ECMAScriptで書かれた同等のロジックよりも実行速度が速いとは限りません。これはJavaにはコンストラクタ呼び出しチェーンなど、固有のオーバーヘッドの制約が含まれているためです(コンストラクタから他のオブジェクトから継承したJavaオブジェクトを呼び出させた場合、すべての祖先オブジェクトのコンストラクタも呼び出されます。)

ECMAScriptのコアオブジェクト(文字列、アレイ、日付など)には、データ操作、フォーマット、解析、ソート、文字列やアレイの相互変換などの便利な多くの組み込みメソッドがあります。これらのメソッドは、インタープリタの中で高度に最適化されたJavaコードで実装されています。データ解析またはフォーマット機能を「独自にロールダウン」するより、これらのメソッドをできる限り使用すると有利です。たとえば、長い文字列を区切り文字が存在するたびに複数の下位文字列に分解するとします。文字列メソッドのindexOf()substring()を使用するループを作成して、下位文字列に解析し、アレイのスロットにそれらを割り当てることができます。ただし、以下のようにできる場合、この方法は非常に効率の悪いテクニックとなります。

  var myArrayOfSubstrings = bigString.split( delimiter );

ECMAScriptの文字列メソッドsplit()は、指定した区切り文字の値に基づいて下位文字列のアレイに文字列を分解します。これは、ネイティブJavaで実行され、インタープリタにスクリプトの1行のみを解読するように指示します。indexOf()substring()を繰り返し呼び出すループで同じことをしようとすると、必要のない大きなインタープリタと関数コールのオーバーヘッドを含むことになり、関係者のパフォーマンスに影響します。

ECMAScriptの組み込みメソッドを巧みに使用することは、パフォーマンスを改善する上で有用なことです。 スクリプトを広く使用する場合は、パフォーマンス上の欠点を排除する上で役立つため、ECMAScript言語の細かい点について時間をかけて学習してください。

 
Top of page

XPathとは何か

XPathはXMLドキュメントないのコンテンツのアドレス指定と検索のためのシンタックスを記述するW3C標準です。 XPathはまた、文字列、式、ブール値の操作のための簡易「表現言語」も備えているため、ユーザはXMLデータの構築と集積を細かくコントロールできます。

XPathは、ペアレントとチャイルドを持つ「ノード」のツリーとして、XMLドキュメントをモデルにしています。このノードには、要素ノード、属性ノード、およびテキストノードがあります。XPathは、ペアレントとチャイルドをスラッシュで分割する、一部のファイルシステムのディレクトリ/ファイルパス指定規則に類似するアドレス指定スキームを使用します。次のような一般的な構造が適用されます。

XPathアドレスは式とも呼ばれ、コンテキストを参照して評価されます。Composerのコンテキストは通常、Input、Input1、Input(n)、Temp、またはOutputなどのDOMです。Composerのコンテキストにはまた、XPath式の単に別名または省略形であるグループ名を使用することもできます。

 
Top of section

XPathの対象者

XPathはXMLドキュメントの処理に必要なほとんどすべてのタスクに対してComposerのすべてのユーザにより使用されることを目的としています。プログラマには、XPathのアドレス指定機能が不十分であると感じる場合があるでしょう。そのような場合、XMLドキュメントのアドレス指定のために代わりにより細かいDOMメソッド(DOMについての説明を参照)を使用することができます。XPathとDOMの両方が不適切である場合は常に、XMLドキュメントを直接、Javaプログラムで処理することもできます。

 
Top of section

XPathを使用するタイミング

XMLドキュメントで要素(または属性)または要素(属性)のグループを参照するたびに、XPath式を使用できます。特に、XPath式をマップアクションで頻繁に使用して、XMLドキュメント間のデータ転送のための入出力を指定します。また、Group宣言(XPath式のツリーノードマッチングのリストを作成する)と要素の繰り返しアクションでXPathを使用して、ドキュメントの要素の反復パターンに別名を作成することもできます。

作成するカスタムECMAScript式のXPath式を使用することもできます。Composerは、ECMAScript関数内のXPath式を使用するXPath()という特別なブリッジメソッドを備えています。一般的なシンタックスは次のとおりです。

  Input.XPath(\xd2 ROOT/PARENT/CHILD\xd3 )

XPath()メソッドはDOMオブジェクトのペアレントで、この例ではInputという名前が付けられています。また、XPath()の引数は文字列です。(リテラル、スタティック文字列、または文字列変数のいずれも使用できます。)

 
Top of section

XPathがComposerに組み込まれる方法

XPathはComposerの基本的なアドレス指定メカニズムです。それは、マップ、要素の繰り返し、およびグループの繰り返し(さらに、その他の多く)などのアクションのダイアログを経由してComposerに直接、組み込まれます。 これらのアクションで、XPathは「コンテキスト」と「式」の2つの部分として 指定されます。XPathコンテキストは、「ベースアドレス」を表し、それに関連して式の残りの部分の評価が行われます。ほとんどの場合、これにはXMLドキュメントのルート(ドキュメントオブジェクトなど)を表すDOMの単純な名前(Input、Input1、Temp、Outputなど)が使用されます。

XPathの式の部分は上から下への順番で、処理されるノード(またはノードのリスト)に導く連続する要素を指定します。

XPathはドラッグアンドドロップを通じて作成されたマップアクションにより自動的にComposerに作成されます。 XPath式は、有効なXPathステートメントの選択リストを示すXPath式ビルダを使用して、マップアクションのダイアログで指定することができます。ダイアログで[XPath]ラジオボタンが選択されているときはいつでも、[式ビルダ]ボタン(次の図を参照)を押すことによってXPath式ビルダにアクセスできます。

Composerは特別なメソッド.XPath()によりEMCAScriptにXPathを統合します。これは、ECMAScript言語内のXPathシンタックスを使用してXMLドキュメントの部分をアドレス指定することができます。

Composerにはまた、XPathに関連したグループの概念もあります。グループ名を宣言するとき、ドキュメントに複数あるXPathパターンに関連付けられます。結果として、ツリーに2つの特別なノードのリストが得られます。最初のリストはパターンに基づいたXMLドキュメントで見つかったそれぞれの固有ノードの値に対する1つのエントリを含むグループです。その後で、各グループのアクションを一度処理するグループの繰り返しループをセットアップすることができます。

2番目のリストは各グループ(固有または固有でない)の各メンバーに対して1つのエントリを含むグループ(詳細)です。その後で、各グループメンバーに対してアクションを一度処理する「グループの繰り返し」ループをセットアップすることができます。

 
Top of section

XPathの例を参照する

マップアクションのXPath

XpathinMapAction

上記の例で、コンテキストは、「Input」DOMです。XPath式は、「INVOICEBATCH/INVOICE/INVOICEHEAD/INVOICENO」で、INVOICE NOの要素の場所をINVOICEHEADの子として指定し、INVOICEHEADはINVOICEの子で、INVOICEはINVOICEBATCHの子になります。

ECMAScriptのXPath

XpathinECMAScript

上記の例で、コンテキストはメソッド「.XPath( )」を使用してINVENTORY_STATUS/SKUの場所を指定し、それをテキスト文字列(ソースXML)に変換するXMLドキュメントオブジェクト「Input1」です。その後、このテキスト文字列オブジェクトはECMAScriptメソッドを使用して操作できます。

グループのXPath

10DeclareGroup

上記の例で、グループ名「srgSELLERNAME」はXPath「$Input/INVOICEBATCH/INVOICE/SELLERNAME」の固有のデータ値に基づいてノードのリストを作成します。固有のノードのこのリストは、各グループの各メンバーの個々の値の代わりに、固有のグループ値に基づいてデータをマップする「グループの繰り返し」ループアクションにより処理できます。

 
Top of page

XPath関数

XPathのリテラルアドレス指定機能を増大していく過程で、XPathの設計者は表現言語を仕様の中に作成し、洗練されたフィルタリング、内観、ノードセットの集積を許可します。 XPathは事実上、文字列、数値、ブール値、およびノードセットの4つのデータ型をネイティブに認識する2ダース以上の便利な関数(Table 10-2を参照)を 事前定義しています。これらの関数を通常のXPathアドレス指定と連携して使用すると、XML開発者にXMLデータの操作のための強力なツールを与えることになります。

表10-2  これらの関数のすべては、ロールオーバー(ツールヒント)ヘルプと共にComposerの式ビルダにあります。

XPath関数

ノードセット関数

number last()

number position()

number count(node-set)

node-set id(object)

string local-name(node-set)

string namespace-uri(node-set)

文字列関数

string name(node-set)

string string(object)

string concat(string, string, string*)

boolean starts-with(string, string)

boolean contains(string, string)

string substring-before(string, string)

string substring-after(string, string)

string substring(string, number, number)

number string-length(string)

string translate(string, string, string)

ブール関数

boolean boolean(object)

boolean not(boolean)

boolean true()

boolean false()

boolean lang(string

数値関数

number number(object)

number sum(node-set) .

number floor(number)

number ceiling(number)

number round(number)

XPath関数の詳細な説明はこのガイドの範囲を超えていますが(代わりに、http://www.w3.org/TR/xpathの完全なXPathの仕様書を参照してください)、XPath表現言語の機能を示すいくつかの例を示します。

表10-3

XPath式

意味

//*

ドキュメントのすべてのノードから構成されるノードセット

count(//*)

ドキュメントのノード数

count(//*[contains(name(),\qmyNode\q)])

名前に(下位)文字列「myNode」を含むドキュメントのノード数

name(//*)

すべてのノードのセットから、ドキュメントの最初のノード名をドキュメントの順序で検索します。 (すなわち、ルートノード名を検索します。)

//*[name()=\qmyNode\q]/@*

すべてのノードのセットから開始して、「myNode」という名前のノードを検索し、そのノードの下の最初の属性の値を、ノードの順序で取得します。

name(//*[name()=\qmyNode\q]/@*)

ノード「myNode」で見つかった最初の属性ノードの名前を取得します

concat(//*[name()=\qmyNode4\q]/@*,\q is what was found\q)

要素「myNode4」の下の最初の属性に保存されている値を「is what was found」という文字列と結合します。

より詳細なXPathの例については、出荷時にComposerに添付された「Action Examples」プロジェクトを参照してください。

 
Top of section

XPathのドキュメントリソース

 
Top of page

XSLについて

次の節では、XSLを使用するカスタムスクリプトの作成について説明します。

 
Top of section

XSLとは

Extensible Stylesheet Languageは、XMLドキュメントを他の種類のドキュメントに変換するための言語です。スタイルシート言語と同様、XSLはフォーマットの指定にXMLボキャブラリーを含みます。

HTMLと異なり、XMLの要素名では直感的にわかる表記法は使用されていません。スタイルシートなしでは、XMLの配信プロセスでは区別できない文字列として以外にXMLドキュメントの内容をレンダリングする方法がまったくわかりません。XSLはXMLシンタックスを使用して理解可能なスタイルシートを作成するための包括的なモデルとボキャブラリーを備えています。

XSLの機能はXSLT (XSL Transformations)で増大します。これはXML構造を操作するためのプレゼンテーションを目的としない変換言語です。XSLTはソースXMLドキュメントまたはスタイルシートの作成者のいずれかから提供された文字列をフィルタリング、条件付処理、および生成するための要素を選択するためにXPathにより定義される表現言語を利用します。

 
Top of section

XSLの対象者

XSLに興味をもつユーザは、Webマスター、eCommerceサイト作成者、ポータル作成者、およびB to B取引の一部としてXMLドキュメントのグラフィック表示が必要な人々です。

XMLドキュメントを使用すると、設計者はXSLスタイルシートを使用して構造化したコンテンツを提示する方法を指定できます。つまり、WebブラウザやPDAなどのウィンドウ、またはカタログ、レポート、パンフレット、または書籍の物理的なページのセットなどのプレゼンテーション媒体でソースコンテンツのスタイルを指定し、レイアウトするか、ページ指定する、またはそれらのすべてを行う方法を指定できます。

 
Top of section

XSLを使用するタイミング

XSLはXML配信デバイスが人間が認識できる方法でXMLを表示することを許可するように設計されています。XMLデータ交換は、Webショッピング、データ監査、通知、またはデータのグラフィック表示を必要とするその他のユーザ操作を含む場合が頻繁にあります。要約すると、XMLプレゼンテーションを使用可能にする必要があるたびにXSLを使用します。

 
Top of section

XSLがComposerに組み込まれる方法

XSLはすべてのコンポーネントで使用可能なXSL Transaction Actionを使用してComposerに組み込まれます。アクションを使用するためには、ソースDOM、XSLスタイルシート、および保存先DOM (例、TempまたはOutput)のパラメータを指定する必要があります。説明については、次の節を参照してください。

Composerにはまた、カスタムスクリプトまたは関数アクションに使用する特別なXSLメソッドもあります。

  transformNodeViaDOM() 
  transformNodeToObject(,)
  transformNodeViaXSLURL()

これらのメソッドの詳細については、次のAPIの説明を参照してください。

exteNdを使用して作成するWebサービスをまた、XSLを変換したXMLをHTMLに直接出力するようにセットアップすることもできます。処理命令を使用したHTMLへの展開に関する詳細は、特定のアプリケーションサーバプラットフォームのexteNd Composer Enterprise Serverに関するガイドで、展開を説明した章を参照してください。

 
Top of section

XSLの例を参照する

次に示すProcess XSLアクションは、[XSL URL]フィールドで指定されたXSLスタイルシートを使用して、入力パートを変換し、出力ドキュメントの「MyHTML」と呼ばれるXML要素に結果を挿入します。

10ProcessXSL

XSLの使用法に関する詳細は、Composerのインストールの「Action Examples」プロジェクトを参照してください。

 
Top of section

XSLのリソース

 
Top of page

Novell Scripting拡張について

NovellのECMAScriptの拡張は、xObject、DOM、その他のComposerオブジェクトを含む汎用スクリプト作成のための便利な方法のセットから構成されています。 すべてのメソッドは、式ビルダの選択リストに示されています。APIの概要は次に示すとおりです。

汎用拡張

汎用拡張は、操作するオブジェクトの種類により分類され、次のものから構成されます。

ノード

XML - このプロパティは、DOMを示す文字列を返します。

createXPath(XPathType asPattern) - XPathパターンを作成します。

getXML() - このプロパティはDOMを示す文字列を返します。

ドキュメント

text - このプロパティは、その下のすべてのテキストノード(コンテンツ)の連結された文字列を返します。

setDTD(node RootElementName, object PublicName, object URL) - ドキュメントのDTDファイルをセットします。

setValue(Object aValue) - 渡されたオブジェクトからドキュメントの値を設定し、それが別のドキュメントにある場合は、このメソッドが子ノード(要素と属性)をコピーします。渡されたオブジェクトがテキストの場合、DOMを作成するように解析されます。

toString() - DOMドキュメントをXML形式の文字列に変換します。

transformNodeViaDOM(XSLDOM) - XSLDOMに従ってドキュメントを変換し、文字列を返します。パラメータXSLDOMはXSLスタイルシートであり、XML交換アクションによりコンポーネントに読み込まれている可能性があります。このメソッドはマップアクションのソースで使用することができるか、Server FrameworkクラスIGXSXSLProcessorにそれを呼び出します。

transformNodeToObject(XSLDOM, OutputDOM) - XSLDOMに従ってドキュメントを変換し、出力DOMに結果を返します。パラメータXSLDOMはXSLスタイルシートであり、XML交換アクションによりコンポーネントに読み込まれている可能性があります。パラメータOutput DOMは、結果のターゲットDOMです。このメソッドは、コンポーネントから関数アクションに挿入できます。また、カスタムスクリプトからは、すべての3つのDOMが揃ったときに一度使用することができるか、Server FrameworkクラスIGXSXSLProcessorを使用してServletで呼び出すことができます。

transformNodeViaXSLURL(XSLURLLocation) - XSLURLLocationに従ってドキュメントを変換し、文字列を返します。パラメータXSLURLLocationは、XSLスタイルシートです。このメソッドは、マップアクションに挿入されるか、またはカスタムスクリプトからは、DOMが揃ったら一度使用することができるか、Server FrameworkクラスIGXSXSLProcessorを使用してServletで呼び出すことができます。

validate() - XPathTypesはタイプNodeList、String、Number、またはBooleanのいずれでもかまいません。通常、XPathパターンと一致するノードリストを返すために使用されます。リストから特定のノードを選択するためにはブラケットを使用します[例、Input.XPath("INVOICE/LINEITEM[1]")またはInput.XPath("INVOICE/LINEITEM[last()]")]。属性によりノードを選択する場合は@を使用します(例、Input.XPath("INVOICE/LINEITEM[@myattr]")。属性値により選択する場合...Input.XPath("INVOICE/LINEITEM[@myattr=\qabc\q]")。

Nodelist XPath(XPathType asPattern) - XPathTypeはタイプNodeList、String、Number、またはBooleanのいずれでもかまいません。通常、XPathパターンと一致するノードリストを返すために使用されます。リストから特定のノードを選択するためにはブラケットを使用します[例、Input.XPath("INVOICE/LINEITEM[1]")またはInput.XPath("INVOICE/LINEITEM[last()]")]。属性によりノードを選択する場合は@を使用します(例、Input.XPath("INVOICE/LINEITEM[@myattr]")。属性値により選択する場合...Input.XPath("INVOICE/LINEITEM[@myattr=\qabc\q]")。

要素

text - このプロパティは、その下のすべてのテキストノードのテキストを連結して返します。

booleanValue() - 可能であれば、このオブジェクトのブール値(trueまたはfalse)を返します。

countOfElement(String propertyName) - 指定された子の個数を返します。

doubleValue() - 可能であれば、このおオブジェクトの倍精度浮動小数点数値を返します。

exists(String propertyName) - 指定された子の存在をチェックします。

getIndex() - 現在のインデックスを返します。

getParent() - 親要素を返します。

setIndex(int aiIndex)\x97 この要素のイテレータインデックス値を設定します。

setText(String asText) - この要素に関連付けるテキストノードを設定します。

setValue(Object aValue) - 渡されたオブジェクトを参照して要素の値を設定します。その値が他の要素を指していれば、子ノード(要素および属性)もコピーします。

toNumber() - テキストノードを数値に変換します。

toString() - この要素に関連付けられたテキストノードを返します。

Nodelist XPath(XPathType asPattern) - XPathTypeはタイプNodeList、String、Number、またはBooleanのいずれでもかまいません。通常、XPathパターンと一致するノードリストを返すために使用されます。リストから特定のノードを選択するためにはブラケットを使用します[例、Input.XPath("INVOICE/LINEITEM[1]")またはInput.XPath("INVOICE/LINEITEM[last()]")]。属性によりノードを選択する場合は@を使用します(例、Input.XPath("INVOICE/LINEITEM[@myattr]")。属性値により選択する場合...Input.XPath("INVOICE/LINEITEM[@myattr=\qabc\q]")。

属性

text - このプロパティは属性のテキスト値を返します。

setValue(Object aValue) - 渡されたオブジェクトを参照して、属性値を設定します。

toString() - この属性に関連付けられたテキストノードを返します。

NodeList

avg(NodeList) - NodeListの平均値を返します。タイプXPathのNodeListパラメータ。パラメータが指定されない場合、現在のNodeList/GroupNameが使用されます。

count(NodeList) - NodeListに含まれるノードの個数を返します。タイプXPathのオプションのNodeListパラメータ。パラメータが指定されない場合(通常の場合)、現在のNodeList/GroupNameが使用されます。

min(NodeList) - NodeListの最小値を返します。タイプXPathのNodeListパラメータ。パラメータが指定されない場合、現在のNodeList/GroupNameが使用されます。

max(NodeList) - NodeListの最大値を返します。タイプXPathのNodeListパラメータ。パラメータが指定されない場合、現在のNodeList/GroupNameが使用されます。

sum(NodeList) - NodeListの合計値を返します。タイプXPathのNodeListパラメータ。パラメータが指定されない場合、現在のNodeList/GroupNameが使用されます。

where(XPathType asPattern)\x97 XPathパターンと一致するノードのNodeListを取得します。

Component (xObject)

theComponentというオブジェクトは、式ビルダを使用して各Composerコンポーネントの中に示されます。(関数アクション、マップアクション、またはアイコンが表示される他のダイアログの[式]アイコンをクリックすることにより、[式ビルダ]ウィンドウを開くことができます。) コンポーネントベースのメソッドは、Extended ECMAScript/Componentの下の選択リストに示されます(次を参照)。

10ComponentMethods

Componentというコンポーネントには、以下のメソッドがあります。

getName() - 現在実行中のコンポーネントの名前を返します。現在実行中のコンポーネントの名前を取得するには、次の通り呼び出します。

  Component.getName()

exportObject(key,value) - ECMAScript変数またはJavaオブジェクトへの参照を、ハッシュテーブルに格納します。あるサービスの他のコンポーネントから、オブジェクトを検索し、使えるようになります (ハッシュテーブルに格納しなければ、ユーザ変数はこれを宣言したコンポーネント内でのみ可視であり、他のコンポーネントからは参照できません)。 変数testStringを作成し、同じサービスに属する他のコンポーネントからも参照できるようにする例を示します。

  // create an instance of the string:
  testString = \qhello\q;
  
  // now export it:
  theComponent.exportObject("myExport", testString)

ハッシュキー「myExport」は、実際にはどんな名前でも構いません。 他のコンポーネントでは、エクスポートされたオブジェクト(testString)を、この名前で検索します。 他のコンポーネントでは次のように記述します。

var copyOfString = theComponent.getExportValue("myExport");

このコードを実行したコンポーネントでは、元々testStringという変数として他のコンポーネントで作成された、\qhello\qという文字列にアクセスできます。

この形式でエクスポートされた変数またはオブジェクトは、作成された「サービス」インスタンスに限定されることを理解しておくことが重要です。 すなわち、

注記:   変数のサービス間スコープセッションを達成するためは、次に示されたputSessionValue()getSessionValue()メソッドを使用します。

また、設計時の制限として、エクスポートされた変数にアクセスするためには、当該変数を作成するサービスまたはコンポーネントが、その時点で動作していなければならないことにも注意してください。 たとえば、サービスAが変数myVarを作成し、\qmyExportedVariable\qという名前でエクスポートするとします。 さらに、サービスAがコンポーネントBを呼び出す(実行する)としましょう。コンポーネントBには、変数を検索する、次のような関数アクションがあります。

theVar = theComponent.getExportValue(\qmyExportedVariable\x92 )

theVarに正しい値が入っているのは、サービスAが動作中で、さらに、myVarをエクスポート済みである場合に限ります。 言い替えると、サービスAを起動せずにコンポーネントBだけをアニメーション実行した場合、myVarは可視にならないのです。 したがって、想定どおりに動かすには、あらかじめサービスAをアニメーション実行しておかなければなりません。サービスAをステップ実行し、コンポーネントBを実行するコンポーネントアクションに到達したら、[ステップイン]ボタンでコンポーネントBのアクションモデルに制御を移し、コンポーネントBをステップ実行します。このような手順にすれば、AもBも同じスコープに入るので、エクスポートされた変数を使うことができます。

getExportValue(key) - 他のコンポーネントでエクスポートされたECMAScript変数またはJavaオブジェクトの参照を返します (上記の解説を参照)。

putSessionValue(key,value) - Javaオブジェクトへの参照をグローバル変数に格納します。これにより、同じサーブレットセッション(複数のHTTPセッションにまたがっても可)で動作する、他のサービスまたはコンポーネントから参照できるようになります。この形式でパブリッシュされたオブジェクトは、サーブレットレベルのスコープが設定されています。(セッションの寿命は、HTTPサーバセッションタイムアウトにより決まります。)最初の引数は、パブリッシュされたオブジェクトの名前を表す文字列です。最初の引数は、パブリッシュされたオブジェクトに関連付ける名前を表す文字列です。2番目の引数はオブジェクトです。(このシンタックスは、上記のexportObjectの規則に従っています。)

注記:   このメソッドは、EJBを使用して展開されたWebサービスで使用される場合に例外を生成します。また、このメソッドはJMSサービスで使用することはできません。

getSessionValue(key) - putSessionValue()メソッドを使用して前もってパブリッシュされたJavaオブジェクトへの参照を取得できます。このメソッドはキーと一致するオブジェクトが見つからない場合はヌルを返し、それ以外の場合はオブジェクトを返します。

注記:   このメソッドは、EJBを使用して展開されたWebサービスで使用される場合に例外を生成します。また、このメソッドはJMSサービスで使用することはできません。

removeSessionValue(key)\x97 putSessionValue()メソッド(上記)を使用して前もってパブリッシュされたJavaオブジェクトへの参照を破棄できます。

注記:   このメソッドは、EJBを使用して展開されたWebサービスで使用される場合に例外を生成します。また、このメソッドはJMSサービスで使用することはできません。

LDAPメソッド

getLDAPAttr(String connResource, String dn, String attr) - LDAPディレクトリ中、指定されたオブジェクトのある属性に格納された値を、第1引数で指定された名前の接続リソースを使って検索します。 第2引数はオブジェクトのLDAP識別名を表します。 第3引数は検索したい属性です。 戻り値は数値または文字列データです。 数値か文字列かの判定には、ECMAScriptのtypeof演算子を使います。

getLDAPAttr()メソッドは、ECMAScriptが使えさえすれば、どのようなコンポーネント、サービス、または接続リソースでも使えます (LDAPコンポーネントに限られるわけではないということです)。 LDAPに関係する他のECMAScript拡張メソッドは、LDAPコンポーネントエディタでしか使えません。 詳細については、『LDAP Connectユーザガイド』を参照してください。

Connector指定拡張

ここで説明されている以外の追加のカスタムECMAScriptオブジェクトとメソッドが、exteNdのほとんどのConnect製品に関連して用意されています。(たとえば、JMS指定メソッドは、JMS Connectorを使用してコンポーネントやサービスで使用するために用意されています。)

コネクタ指定のECMAScriptオブジェクトとメソッドに関する詳細は、該当するConnectのドキュメントを参照してください。

 
Top of section

Novell Scripting拡張を使用するタイミング

Composerの汎用拡張は、使用すると便利な場合、またはXPath、DOM、またはXSLの類似するメソッドよりも確かな場合、またはその両方の場合に使用します。

XMLファイルに関して反復するが、分散している共通データを要約するとき、Composerのグループ化または集積関連拡張の一部を使用する場合があります。たとえば、XMLファイルは組織のたった7部門で作成された50のランダムな請求書で到着することがあります。 Composerのグループ化機能とグループ指向のメソッドを使用して、50の請求書を容易に部門ごとに整理し、各グループごとの「合計請求金額」を求めることができます。

 
Top of section

Novell Scripting拡張がComposerに組み込まれる方法

汎用拡張はECMAScriptに組み込まれ、式ビルダの選択リストに他のオブジェクト、プロパティ、およびメソッドと共に表示されます。

Composerのグループアクションでは、グループの基礎を形成するXPathパターンを生成するための選択リストをクリックするだけでグループを指定します。GroupまたはGroup (Detail)の各メンバーに対してアクションのセットを処理する「グループの繰り返し」アクションがあります。集計メソッドは[マップ]ダイアログのECMAScript 式ビルダで選択可能です。

ここに示されたアクションのタイプはすべてConnectコンポーネントタイプで使用できます。

 
Top of section

拡張コードの例

exteNd Composerのインストール先、\Samplesディレクトリにある「Action Examples」プロジェクトには、Composerでさまざまな業務にECMAScriptを適用した例があります。

 
Top of page

DOMについて

 
Top of section

DOMとは

Document Object Modelは、プログラムおよびスクリプトがXMLドキュメントのコンテンツ、構造、およびスタイルをダイナミックにアクセスし、更新することができるインタフェースです。 W3CのDOM (Document Object Model)は、ソフトウェアプログラム内のXMLドキュメント構造の標準的な内部表記であり、プログラマが容易に要素、属性、およびデータにアクセスし、その内容とスタイルを削除、追加、または編集できるようにすることを目的としています。

 
Top of section

DOMの機能とその重要な特長

DOMはオブジェクトとしてプログラム上でXMLドキュメントで作成および操作するための標準的なメソッドおよびプロパティのセットを定義します。要素、属性、テキスト、処理命令などを含むXMLドキュメントのすべてのパートを操作するためのメソッドを提供します。

DOMはまた、XMLドキュメントのノードのアドレス指定と検索のためのメソッドのセットも備えています。

 
Top of section

DOMメソッドの対象者は誰か

DOMメソッドとプログラミングモデルは、DOM操作に対して絶対的にコントロールを必要とするプロの開発者を対象としています。DOMメソッドを操作することにより、開発者はDOMを作成し操作するための初歩的な操作をコントロールできるようになります。たとえば、Composerの簡単なマップアクションは、10行のECMAScript/DOM命令に変換することができます。

 
Top of section

DOMメソッドを使用するタイミング

ECMAScript機能と結合されるComposerの基本アクションがXMLドキュメント処理のニーズを満たすとき、DOMメソッドを使用することができます。

 
Top of section

DOMメソッドがComposerに組み込まれる方法

Composer DOMを操作するためのDOMのメソッドとプロパティは、アクションのカスタムスクリプトエディタまたはECMAScript式ビルダでのみ使用できます。ダイアログで[式]ラジオボタンが選択されているときはいつでも、[式ピルダ]ボタン(以下を参照)を押すことによってECMAScript式ピルダにアクセスできます。

10ExpressionBuilderButton

 
Top of section

DOMメソッドの例を参照する

 
Top of section

DOMSのドキュメントリソース

 
Top of page

Javaの統合について

Javaは単なるプログラミング言語ではありません。 Javaは同じソフトウェアがPC、UNIXワークステーション、ワイヤレスデバイス、PDA、家電製品、および種々の埋め込み式システムなど、 多くの種類のデバイスを動作させることができるように設計されたコンピューティングプラットフォームです。ネットワークを使用して、種々のデバイスを1つの稼動するアプリケーションに結合させる分散アプリケーションを作成することが可能です。

コンピューティングプラットフォームであることに加え、JavaはJava 2 Enterprise Edition (J2EE)コンピューティングアーキテクチャを元に形成される強固でオブジェクト指向のコンピュータ言語です。これは、その適合性、頑強さ、プラットフォーム中立性および大企業で採用されているレコードトラック機能のため、IT組織で多く採用されるようになりました。J2EEはまた、XMLおよびWebサービスの分野の最新標準と深く結びついています。このことから、Javaは理想的な企業型プログラミング言語であるといえます。

 
Top of section

exteNd ComposerでのJavaの使用

Javaは、外部Javaオブジェクトへのダイレクトブリッジを備えるECMAScriptスクリプト作成環境を通じて、Composerサービスに組み込まれています。Compowerは、ドラッグアンドドロップ機能をもつカスタムスクリプトエディタのJavaクラスブラウザを備え、Javaオブジェクトを素早く組み込み、スクリプト内のコンストラクタ、プロパティ、およびメソッドを使用できるようにします。

 
Top of section

Javaを使用するタイミング

ほとんどのComposerユーザは、WebサービスとXMLの統合の目的を、カスタムJavaクラスを使用することでComposerのネイティブ機能なしで達成することができます。ただし、JavaオブジェクトをexteNdに組み込むことが望ましい場合があります。 たとえば次のような場合です。

 
Top of section

Java統合の例を参照する

XMLアプリケーションのJavaの簡単な使用例では、2つのXML要素でデータの大文字小文字を区別しない比較を実行します。この場合、次のようにJava文字列を使用してカスタムスクリプト関数を作成できます。

  // Case Insensitive Compare, returns 0 if strings are equal, non-zero if not_
  function nonCaseCompare(string1,string2)
  {
  var s1 = new Packages.java.lang.String(string1);
  var s2 = new Packages.java.lang.String(string2);
  return s1.compareToIgnoreCase(s2);
  }

その後、条件付きで異なるアクションを実行するために、決定アクションの関数を使用します(図を参照)。

10JavaExampleCaseCompare

 
Top of section

Javaのドキュメントリソース

次のWebサイトでは、JavaプラットフォームおよびJavaプログラミング言語に関する詳細で的確な情報を見つけることができます。http://java.sun.com




Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved.  more ...