TIBCO EBX® で使用される XPath 表記は、XML パス言語 (XPath) バージョン1.0 標準の省略構文に準拠している必要がありますが、特定の制限があります。このドキュメントでは、サポートされている省略構文について詳しく説明します。
一般的な XPath 式は次のとおりです。
path[predicate]
/library/books/
./Author
../Title
//books
../../books/[author_id = 0101 and (publisher = 'harmattan')]
/library/books/[not(publisher = 'dumesnil')]
starts-with(col3,'xxx') and ends-with(col3,'yyy') and osd:is-not-null(./col3))
contains(col3 ,'xxx') and ( not(col1=100) and date-greater-than(col2,'2007-12-30') )
author_id = $param1 and publisher = $param2
where the parameters$param1
and$param2
refer respectively to0101
and'harmattan'
col1 < $param1 and col4 = $param2
where the parameters$param1
and$param2
refer respectively to100
and'true'
contains(col3,$param1) and date-greater-than(col2,$param2)
where the parameters$param1
and$param2
refer respectively to'xxx'
and'2007-12-30'
パラメーター値は Java API のメソッド Request.setXPathParameter
によってのみ設定できるため、この表記の使用は Java API に制限されています。
構文:
osd:search(fields, queryString[, templateKey])
例
osd:search('col1', 'xxx')
osd:search('col1,col2','xxx')
osd:search('','xxx')
osd:search(col1,'xxx', myTemplate@myModule)
osd:search
関数は、用語または用語のリストを現在のテーブルのフィールドのセットと照合しようとします。この関数は汎用であり、EBX® でサポートされるすべてのフィールドデータ型を処理します。フィールドが指定されていない場合は、すべてのフィールド (履歴テーブルの場合) またはすべての最適化されたフィールド (その他のすべての場合) に対して検索されます。最適化されたフィールドと最適化されていないフィールドの詳細については、制限事項を参照してください。
最適化されたテキスト検索フィルターは、最適化されていないフィルターまたは別のテーブルを含むフィルターと OR 結合できません。詳細については、技術的制限事項を参照してください。
関連するフィールドについて、ラベルが存在する場合、検索は値ではなくラベルを対象とします。ただし、場合によってはまだサポートされていません。詳細については、値のラベル付けを参照してください。
より高度な使用法として、クエリ文字列で特殊な演算子がサポートされています。詳細については、特殊文字を参照してください。
述語 osd:search
はローカライズされています。
ロケールは、Java API Request.setLocale
または Request.setSession
のメソッドで設定できます。
検索テンプレートの識別子を指定して、検索の動作をカスタマイズできます。
osd:has-validation-item()
osd:has-validation-item('error,info')
osd:contains-validation-message('xxx')
osd:contains-validation-message('xxx','info,warning')
検証検索用の XPath 関数は、関連付けおよび外部キーフィルターで定義された XPath 述語では使用できません。
述語 osd:label
、osd:contains-record-label
、および osd:contains-validation-message
はローカライズされています。
ロケールは、Java API Request.setLocale
または Request.setSession
のメソッドで設定できます。
最新の検証レポートで検索が確実に実行されるようにするには、これらの述部を使用する直前に、テーブルの明示的な検証を実行する必要があります。
式 | 形式 | 例 |
---|---|---|
XPath 式 | <container path>[predicate] |
|
<container path> | <absolute path> または <relative path> | |
<absolute path> |
|
|
<relative path> |
|
|
式 | 形式 | 注意/例 |
---|---|---|
<predicate> | 例:A and (B or not(C)) A,B,C: <atomic expression> | 構成:論理演算子の括弧、not() およびアトミック式。 |
<atomic expression> | <path><comparator><criterion> または method(<path>,<criterion>) |
|
<path> | <relative path> または osd:label(<relative path>) | それを含むテーブルの相対パス
|
<comparator> |
| |
<boolean comparator> |
| |
<numeric comparator> |
| |
<string comparator> |
| |
<method> |
| |
<date, time & dateTime method> |
| |
<string method> |
| |
<criterion> |
| |
<boolean criterion> |
| |
<numeric criterion> | 整数または小数 |
|
<string criterion> | 引用文字列 |
|
<date criterion> | 'yyyy-MM-dd' として引用およびフォーマット設定 |
|
<time criterion> | 'HH:mm:ss' または 'HH:mm:ss.SSS' として引用およびフォーマット設定 |
|
<dateTime criterion> | 'yyyy-MM-ddTHH:mm:ss' または 'yyyy-MM-ddTHH:mm:ss.SSS' として引用およびフォーマット設定 |
|
アトミック述語式の基準値部分 (右側) で XPath 1.0 式を使用することができます。
たとえば、[./a=3]
の代わりに、式 [./a=(floor(./d)+ 2.0)]
を使用できます。
述語はデータモデルノードと基準のノードタイプに強く依存するため、アトミック述語式のパス部分 (左側) はノードパスである必要があり、XPath 式にすることはできません。たとえば、式 /table[floor(./a)> ceiling(./d)]
は無効です。
osd:label()
関数は、値の代わりにラベル上の述語を解決するために、アトミック述語のパス部分に適用できます。この場合、使用できるのは文字列演算子と文字列基準のみです。つまり、ends-with(osd:label(./price),'99')
です。
ラベル上の述語はローカライズされているため、条件は述語フィルター処理された要求と同じロケールで表現する必要があります。例:request.setLocale(Locale.FRENCH); request.setXPathFilter("osd:label(./delivery_date)='30/12/2014'");
述語の右側がコンテキスト値である場合、osd:label
関数を使用することは禁止されています。
osd:label
関数がデータモデルで使用されている場合、たとえば、テーブル参照ノードの選択またはフィルター述語で、データモデルのデフォルトロケール (モジュール宣言で定義されている) は、基準形式に使用する必要があります (これは一般的に推奨されていません)。
選択したノードに関連する述語の場合、基準値 (つまり、述語の右側) を構文 ${<relative-path>}
を使用するコンテキストパスで置き換えることができます。ここで、<relative-path> は、選択したノードを基準としたエレメントの相対パスです。基準値は単一の値である必要があります。つまり、集約されたリストはコンテキストパスのターゲットとして許可されません。
メソッドを呼び出す場合、基準は 2 番目のパラメーターであり、最初のパラメーターを相対値にすることはできません。
集約リストの述語の場合、リストエレメントの 1 つが述語を検証すると、コンパレーターに関係なく、述語は true
を返します。
さらに、述語 osd:is-empty
および osd:is-not-empty
は、リストが空かどうかに関係なく、タイプがリストである任意のノードに適用できます。
比較演算子 !=
には特に注意が必要です。たとえば、集約されたリストの場合、 ./list != 'a'
は not(./list = 'a')
と同じではありません。リストにエレメント (e1,e2,..)
が含まれている場合、最初の述語は、 e1 != 'a' or e2 != 'a' ...
と同等であり、2 番目の述語は、e1 != 'a' and e2 != 'a' ...
と同等です。
null 値は、演算子 osd:is-null
および osd:is-not-null
を使用して、述語で明示的に処理する必要があります。
たとえば、/root/products[./price<100]
または /root/products[./price!=100]
は、価格が (null
) に設定されていない商品を返しません。後者の場合も、未設定の値を返すには、述語を /root/products[./price!=100 または osd:is-null(/price)]
にする必要があります。
デフォルトでは、リテラル式は一重引用符 ('
) で区切られます。リテラル式に一重引用符が含まれ、二重引用符が含まれていない場合、式は二重引用符 ("
) で区切る必要があります。リテラル式に一重引用符と二重引用符の両方が含まれている場合は、一重引用符を二重引用符で囲む必要があります。
Java API のメソッド XPathExpressionHelper.encodeLiteralStringWithDelimiters
がこれを処理します。
encodeLiteralStringWithDelimiters
の使用例
リテラル式の値 | このメソッドの結果 |
---|---|
| 'Coeur' |
| "Coeur d'Alene" |
| 'He said: "They live in Coeur d''Alene".' |
EBX® では、外部キーは osd:tableRef
宣言で 1 つのフィールドにグループ化されます。
標準の XPath 構文が拡張され、ターゲットの主キーフィールドの値が抽出されるようになりました。
テーブル /root/tableA
に「fkB」という osd:tableRef
フィールドがあり、そのターゲットが /root/tableB
で、tableB
の主キーが xs:int
型の id
と xs:date
型のdate
という 2 つのフィールドがある場合、以下の式が有効となります。
/root/tableA[fkB = '123|2008-01-21']
。ここで、文字列 "123|2008-01-21" は、主キー値全体を表します。
詳細については、Syntax of the internal String representation of primary keys を参照してください。
/root/tableA[fkB/id = 123 and date-equal(fkB/date、 '2008-01-21')]
。ここで、この述語は前の例の述語と同等ですが、より効率的です。
/root/tableA[fkB/id>= 123]
。対象となる主キーフィールドのタイプは xs:int
であるため、任意の数値演算子を使用できます。
/root/tableA[date-greater-than( ./fkB/date、 '2007-01-01')]
。対象となる主キーフィールドがタイプ xs:date
であるため、任意の日付演算子を使用できます。
/root/tableA[fkB = ""]
は、対象の主キーに 2 つの列があるため、無効です。
/root/tableA[osd:is-null(fkB)]
は、外部キーが null
(未定義) であるかどうかを確認します。
Java API での XPath の使用
Java API では、XPathFilter
クラスを使用して、XPath 述語を定義し、それらに対して要求を実行できます。
XPathExpressionHelper
クラスは、XPath 述語とパスを処理するための実用的なメソッドを提供します。