| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
sxml.sxpath - SXMLクエリ言語 SXPathは、XML Information set (Infoset)のインスタンスのS式フォームである SXMLのためのクエリ言語です。
これは最初にOleg Kiselyovによって書かれ、Dmitry LizorkinとKirill Lisovsky によって改良されました。 このモジュールにはまた、Dmitry LizorkinとKirill LisovskyによりSXPathのために 書かれたたくさんの手続きが盛り込まれています。
現在のバージョンは、sxpathlib.scm v3.915、sxpath.scm v1.1、sxpath-ext.scm v1.911を ベースにしています。
このマニュアルは、そのほとんどがオリジナルのソースファイルのコメントより 導出されています。
このモジュールは3つのレイヤから構成されます。
| 11.29.1 SXPathの基本的なコンバータとアプリケータ | ||
| 11.29.2 SXPathクエリ言語 | ||
| 11.29.3 SXPathの拡張 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンバータは、以下を満たす関数です。
type Converter = Node|Nodeset -> Nodeset |
コンバータは、述語としての役割を担うこともあります。
その場合、コンバータが、ノードやノードセットに適用され、空ではないノードセットを
返す場合、述語としてのコンバータは満足したものとみなされます。
このファイルを通して、nilノードセットは失敗を表す#fと等価です。
与えられたオブジェクトがノードセットならば、#tを返します。
xがノードセットならば、それをそのまま返し、そうでなければそれを リストでラップして返します。
objがSXMLの要素であれば#tを返し、そうでなければ#fを 返す述語です。
関数ntype-names??は、判定基準として受け付け可能なノード名のリストを取り、
関数を返します。この関数は、ノードに適用された際、そのノード名が判定基準リストに
含まれていれば#tを、含まれていなければ#fを返す関数です。
ntype-names?? :: ListOfNames -> Node -> Boolean |
関数ntype??は、型に関する判定基準を取り、関数を返します。
この関数は、ノードに適用された際、そのノードがそのテストを満足するかを
返します。
ntype?? :: Crit -> Node -> Boolean |
判定基準critは、以下のシンボルのうちの1つです。
idそのノードが正しい名前(id)を持っているかをテストします。
@そのノードがattributes-listであるかをテストします。
*そのノードがElementであるかをテストします。
*text*そのノードがテキストノードであるかをテストします。
*data*そのノードがデータノード(テキスト、数値、真偽値などで、ペアではない)であるか をテストします。
*PI*そのノードがPIノードであるかをテストします。
*COMMENT*そのノードがCOMMENTノードであるかをテストします。
*ENTITY*そのノードがENTITYノードであるかをテストします。
*any*どんなタイプのノードに対しても#tを返します。
この関数は、名前空間IDを取り、述語Node -> Booleanを
返します。この述語はまさにその名前空間IDを持つノードに対しては
#tを返します。ns-idは文字列です。
(ntype-namespace-id?? #f)は、完全修飾されていない名前を
持つノードに対して#tを返します。
この関数は、述語を取り、それを反対にして返します。
与えられた述語が#fや'()を返す場合、反対にされたものは
与えられたノード(#t)を返します。
等価な述語としてのコンパータにカリー化します。すなわち、
((node-eq? a) b) ≡ (eq? a b) ((node-equal? a) b) ≡ (equal? a b) |
node-pos:: N -> Nodeset -> Nodeset, or node-pos:: N -> Converter |
ノードセットのN番目の要素を選択し、1つの要素を持つノードセットを返します。
N番目の要素が存在しなければ、空のノードセットを返します。
((node-pos 1) Nodeset)は、ノードセットの先頭ノードがあればそれを選択します。
((node-pos 2) Nodeset)は、2番目のノードがあればそれを選択します。
Nは負の数でも構いません。その場合、ノードはリストの末尾から数えられます。
((node-pos -1) Nodeset)は、空ではないノードセットの最後のノードを選択します。
((node-pos -2) Nodeset)は、最後から2番目のノードがあればそれを選択します。
filter:: Converter -> Converter |
フィルタリングを行う、フィルタアプリケータです。
引数のコンバータは、#fあるいはnilとなることが失敗を意味する述語と
みなされます。
take-until:: Converter -> Converter, or take-until:: Pred -> Node|Nodeset -> Nodeset |
述語としてのコンバータとノードセットが与えられると、
ノードセットの各要素に述語を適用し、
述語が#fあるいはnil以外を返すと、
(その述語が失敗した)その時点までに処理された要素を返します。
take-untilは、上のフィルタのバリエーションの1つです。
take-untilは、その述語を満足する最初の要素(それ自体は含まない)まで、
順序付けられた入力のセットの要素をパスします。
((take-until (not pred)) nset)により返されるノードセットは、
((filter pred) nset)により返されるノードセットのサブセット
– 具体的には接頭辞 –になります。
take-after:: Converter -> Converter, or take-after:: Pred -> Node|Nodeset -> Nodeset |
述語としてのコンバータとノードセットを与えると、
述語をノードセットの各要素に適用し、
述語が#fかnil以外を返すと、
まだ述語が適用されていない要素を返します。
つまり、述語を満足する最初の要素の後に続く要素を返します。
take-afterとtake-untilを一緒に使うと、
入力のノードセットを3つのパート:
述語を満足する最初の要素、その要素の前の部分、その要素の後の部分に
分けます。
procをlstの各要素に適用し、結果のリストを返します。 procがノードセットを返す場合、それを結果につなぎ合わせます。
別の観点から見ると、map-unionはConverter->Converter関数で、
結合を行いたいコンテキストでの引数としてのコンバータに
位置します。
node-reverse :: Converter, or node-reverse:: Node|Nodeset -> Nodeset |
ノードセットでのノードの順番を逆順にします。 この基本的なコンバータは、逆順のドキュメントオーダーを実装するために 必要です。(XPath勧告を参照して下さい。)
node-trace:: String -> Converter |
(node-trace title)は、それ自身を返すコンバータです。
また、自身が適用されるノードやノードセットを、'title'という
プリフィックスを付けてプリントします。
このコンバータは、デバッグの際にとても便利です。
コンバータの組み合わせに続くものは、コンバータを一変させる、 あるいはコンバータのシーケンスを1つの強力なコンバータにつなぎ合わせる 高階関数です。そのゴールは、XPathのロケーションパスに対応する コンバータとなることです。
別の観点から見ると、コンバータは、コンバータ群の適用の固定され 名前の付いたパターンとみなせます。 以下に挙げるのは、XPathのロケーションパスの仕様を実装する そのようなパターンの完全なセットです。 結局のところ、これら全てのコンビネータはいくつかの基本的なブロック、 通常の関数的なコンポジション、map-unionとfilterアプリケータ、 ノードセットユニオンなどから構築することができます
select-kids:: Pred -> Node -> Nodeset |
ノードを与えると、述語(実際はコンバータ)を満足するその子要素の (順序付けられた)サブセットを返します。
select-kids:: Pred -> Nodeset -> Nodeset |
上と同じですが、ノードセットの全てのノードの子要素から選択します。
node-self:: Pred -> Node -> Nodeset, or node-self:: Converter -> Converter |
select-kidsに似ていますが、自身をその子要素に適用するのでは なく、ノードそれ自身に適用します。 結果のノードセットは、1つのコンポーネントを含むか、 空(ノードが述語を満足しない場合)になります。
node-join:: [LocPath] -> Node|Nodeset -> Nodeset, or node-join:: [Converter] -> Converter |
上のタイトルコメントで説明されるようなロケーションステップ あるいはロケーションパスのシーケンスをつなぎ合わせます。
node-reduce:: [LocPath] -> Node|Nodeset -> Nodeset, or node-reduce:: [Converter] -> Converter |
コンバータの通常の関数的なコンポジションです。
見方を変えると、((apply node-reduce converters) nodeset)は
(foldl apply nodeset converters)と等価です。
すなわち、コンバータのリストをノードセットをseedとして畳み込みや分解
を行うようなものです。
node-or:: [Converter] -> Converter |
このコンビネータは、全てのコンバータを与えられたノードに適用し、
それらの結果のユニオンを作ります。
このコンビネータは、XPathのロケーションパスでの'|'オペレーション
であるユニオンに対応します。
node-closure:: Converter -> Converter |
述語としてのコンバータを満足するノードの全ての子孫を選択します。
このコンビネータはselect-kidsに似ていますが、孫要素やその
子要素達にも適用を行います。
このコンビネータは、XPathの軸である“descendant::”を実装します。
概念的には、このコンビネータは以下のように表現することができます。
(define (node-closure f)
(node-or
(select-kids f)
(node-reduce (select-kids (ntype?? '*)) (node-closure f))))
|
この定義は、字面の通り、フィックスポイントのような何かで、
永久に実行し続けます。しかし、いつかは(select-kids (ntype?? '*))
が空のノードセットを返すことは明白です。その時点では、以降の
イテレーションはその結果に影響を及ぼさず停止されることができます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Evaluates an abbreviated SXPath
sxpath:: AbbrPath -> Converter, or sxpath:: AbbrPath -> Node|Nodeset -> Nodeset |
AbbrPathはリストです。これは、以下の書き換えルールに従って 完全なSXPathに変換されます。
(sxpath '()) -> (node-join)
(sxpath '(path-component ...)) ->
(node-join (sxpath1 path-component) (sxpath '(...)))
(sxpath1 '//) -> (node-or
(node-self (ntype?? '*any*))
(node-closure (ntype?? '*any*)))
(sxpath1 '(equal? x)) -> (select-kids (node-equal? x))
(sxpath1 '(eq? x)) -> (select-kids (node-eq? x))
(sxpath1 '(or@ ...)) -> (select-kids (ntype-names??
(cdr '(or@ ...))))
(sxpath1 '(not@ ...)) -> (select-kids (sxml:invert
(ntype-names??
(cdr '(not@ ...)))))
(sxpath1 '(ns-id:* x)) -> (select-kids
(ntype-namespace-id?? x))
(sxpath1 ?symbol) -> (select-kids (ntype?? ?symbol))
(sxpath1 ?string) -> (txpath ?string)
(sxpath1 procedure) -> procedure
(sxpath1 '(?symbol ...)) -> (sxpath1 '((?symbol) ...))
(sxpath1 '(path reducer ...)) ->
(node-reduce (sxpath path) (sxpathr reducer) ...)
(sxpathr number) -> (node-pos number)
(sxpathr path-filter) -> (filter (sxpath path-filter))
|
sxpathには、いくつかのラッパ関数があります。
sxpathは、常にリストを返し、それはSchemeでは#tとなります。
if-sxpathは、空リストの代わりに#fを返します。
もし存在すれば、最初に見つかったノードを返します。
そうでなければ、#fを返します。
もし存在すれば、最初に見つかったノードを返します。 そうでなければ、空リストを返します。
与えられたノードについて、(ID_value . element)の
ペアのリストをインデックスとして構築します。
lpathsは、タイプIDの属性のロケーションパスです。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
W3CのXPathコア関数ライブラリのSXML版です。
XPathのstring関数(XPath勧告のセクション4.2)に対応するものです。
与えられたオブジェクトを文字列に変換します。
注意:
XPathのboolean関数(XPath勧告のセクション4.3)に対応するものです。
引数を真偽値に変換します。
XPathのnumber関数(XPath勧告のセクション4.4)に対応するものです。
引数を数値に変換します。
注意:
string->numberの変換は、IEEE 754の四捨五入ではありません。
XPath勧告のセクション5.1 - 5.7にしたがって、与えられたノードの 文字列値を返します。
XPathの仕様2.3にしたがい、このテストはいかなるXPathノードに 対しても真を返します。 SXMLの補助的なリストや属性のリストは除外されます。
与えられたSXMLノードの属性のリストを返します。 与えられたノードが要素ではないか、属性のリストを持っていない場合は、 空リストが返されます。
SXML要素を、そのユニークなIDによって選択します(XPath勧告 4.1)。
objectを引数に取るコンバータを返します。
このobjectは、ノードセットか、'string'関数により
文字列に変換できるデータタイプです。
id-indexは、( (id-value . element) (id-value . element) ... )です。
このインデックスは、要素をそのユニークなIDによって選択するために使われます。
XPathオブジェクトの比較子:
XPathの等値比較: =、!=のためのヘルパです。
bool-op、number-op、'string-opはそれぞれ、
真偽値、数値、文字列のペアのための比較子です。
XPathの等値比較: =、!=に対応するもので、
デフォルトの等値テストを使います。
2つのXPathオブジェクトの関係比較( <、>、<=、>= )
を作ります。
opは、比較を行う手続き: <、>、<=、>=です。
XPathの軸。 結果のノードセットにおける順序は維持されます。
属性の軸です。
子要素の軸です。
この関数は、'select-kids'に似ていますが、処理命令やコメント、
実体ノードについては、空の子リストを返します。
親の軸です。
述語を与えると、RootNode -> Converter関数を返します。
この関数は、rootnodeに適用されると、node -> parentと
なります。
このようなコンバータは、 ((sxml:parent test-pred) rootnode)
を使って構築され、それが適用されたノードの親を帰します。
ノードセットに適用された場合、そのノードセットにあるノードの
親のリストを返します。
rootnodeはSXMLツリー全体のルートノードである必要はありません。
興味の対象となるブランチ(枝)のルートノードでも構いません。
parent::軸は、どんなSXMLノードにも使えます。
祖先の軸です。
祖先と自分の軸です。
子孫の軸です。
子孫と自分の軸です。
後続するものの軸です。
後続する兄弟の軸です。
名前空間の軸です。
先行するものの軸です。
先行する兄弟の軸です。
ポピュラーなショートカット:
((sxml:child sxml:node?) nodeset) |
((select-kids sxml:element?) nodeset) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on October, 7 2008 using texi2html 1.78.