For Development HEAD DRAFTSearch (procedure/syntax/module):

12.61 sxml.tools - SXML構造を操作する

Module: sxml.tools

現在のバージョンは、sxml-toolsのCVSのリビジョン3.13から導出されています。

マニュアルのエントリは主に、オリジナルのソースコードから導出されています。


12.61.1 SXMLの述語

Function: sxml:empty-element? obj

{sxml.tools} 与えられた要素objが空なら#tを返す述語です。 空要素は、ネストした要素、テキストノード、PI、コメントや実体を 持ちませんが、属性や名前空間IDは持つかもしれません。 それは、XMLのempty-elementのSXML版です。

Function: sxml:shallow-normalized? obj

{sxml.tools} 与えられたobjが浅く正規化されたSXML要素であれば#tを返します。 要素それ自体は正規化されていなければなりませんが、ネストした要素は テストされません。

Function: sxml:normalized? obj

{sxml.tools} 与えられたobjが正規化されたSXML要素であれば#tを返します。 要素それ自体とその全てのネストした要素が正規化されていなければなりません。

Function: sxml:shallow-minimized? obj

{sxml.tools} 与えられたobjが浅く最小化されたSXML要素であれば#tを返します。 要素それ自体は最小化されていなければなりませんが、そのネストした要素は テストされません。

Function: sxml:minimized? obj

{sxml.tools} 与えられたobjが最小化されたSXML要素であれば#tが返されます。 要素それ自体とその全てのネストした要素が最小化されていなければなりません。


12.61.2 SXMLへのアクセッサ

Function: sxml:name obj

{sxml.tools} 与えられたSXMLノードの名前を返します。 これは単にcarのエイリアスに過ぎませんが、カプセル化のために導入されています。

Function: sxml:element-name obj

{sxml.tools} sxml:nameの、与えられたobjがSXML要素ではない場合は#fを返す バージョンです。objがSXML要素であれば、その名前を返します。

Function: sxml:node-name obj

{sxml.tools} sxml:nameの、与えられたobjがSXMLノードでない場合は#fを返す、 安全なバージョンです。objがSXMLノードであれば、その名前を返します。

Function: sxml:ncname obj

{sxml.tools} 与えられたobjの完全修飾名(Namespaces in XML production [6])のローカルパート、 つまりその完全修飾名を“:”で分割した後ろの部分を返します。 与えられたノードの名前がNCName(Namespaces in XML production [4])であれば、 それをそのまま返します。 SXMLの名前はシンボルですが、この関数は文字列を返すことに注意して下さい。

Function: sxml:name->ns-id sxml-name

{sxml.tools} 与えられた名前の名前空間ID部分を返します。与えられた名前がLocalNameの 場合は#fを返します。

Function: sxml:content obj

{sxml.tools} 与えられたSXML要素かノードセット(テキストノードと要素ノードのみ)の内容を、 ドキュメントオーダーにしたがった文字列のリストとネストした要素として 返します。このリストは、objが空要素や空リストの場合は空です。

Function: sxml:content-raw obj

{sxml.tools} 正規化されたSXML要素の全ての内容を、attr-listaux-listを除いて 返します。 したがってそれは、PICOMMENTENTITY ノードとともに、sxml:contentによって返されるTEXTELEMENTも含みます。 戻り値は、ドキュメントオーダーにしたがったノードのリストか、 objが空要素や空リストの場合は空リストになります。 この関数は、sxml:contentよりも高速です。

SXMLの通常のフォームでは、1つの要素は次のようなリストで表現されます。

  (name attr-list aux-list content ...)

attr-list@で始まるリストで、aux-list@@で 始まるリストです。

最小化されたフォームでは、aux-listは空であれば省略できます。 attr-listは、それが空でかつaux-listがなければ省略できます。

以下の手続きは、attr-listaux-listを抽出するものです。

Function: sxml:attr-list-node obj

{sxml.tools} 与えられたobjattr-listを返します。 attr-listが存在しなければ#fを返します。

Function: sxml:attr-as-list obj

{sxml.tools} attr-listをリストにラップして返します。 attr-listが存在せずaun-listがある場合は’((@))を返します。 両方とも存在しない場合には’()を返します。

Function: sxml:aux-list-node obj

{sxml.tools} 与えられたobjaux-listを返します。 attr-listが存在しなければ#fを返します。

Function: sxml:aux-as-list obj

{sxml.tools} aux-listをリストにラップして返します。 aux-listが存在しなければ’()を返します。

Function: sxml:attr-list-u obj

{sxml.tools} 与えられた要素かノードセットの属性のリストを返します。 ((sxpath '(@ *)) obj)と類似です。 属性のリストがない場合は空リストが返されます。

Function: sxml:aux-list obj

{sxml.tools} 与えられた要素かノードセットの補助ノードのリストを返します。 ((sxpath '(@@ *)) obj)と類似です。 補助ノードのリストがない場合は空リストが返されます。

Function: sxml:aux-list-u obj

{sxml.tools} 与えられた要素かノードセットの補助ノードのリストを返します。 ((sxpath '(@@ *)) obj)と類似です。 補助ノードのリストがない場合は空リストが返されます。

-uが付くものは、正規化されていないSXMLノードに対しても 使えるということを示しています。(’u’は’universal’の意味です。)

Function: sxml:aux-node obj aux-name

{sxml.tools} 与えられたSXML要素objaux-nameという名前の付いている最初の 補助ノードを返します。そのようなノードがない場合は#fを返します。 注意: 複数のノードがあっても最初に見つかったノードのみを 返します。したがって、ユニークな名前を持っているノード群に対して 使われることを意図しています。

Function: sxml:aux-nodes obj aux-name

{sxml.tools} 与えられたSXML要素objaux-nameとうい名前の付いている補助ノードの リストを返します。そのようなノードがなければ’()を返します。

Function: sxml:attr obj attr-name

{sxml.tools} 与えられたSXML要素objattr-nameという属性へのアクセッサです。 戻り値は、その属性が存在すればその属性の値、与えられた要素に そのような属性がなければ#fです。

Function: sxml:num-attr obj attr-name

{sxml.tools} 与えられたSXML要素objattr-nameという数値の属性への アクセッサです。 戻り値は、その属性が存在してその値がstring->numberにより数値へ 変換できる場合はその属性を数値としてその属性の値、 与えられた要素にそのような属性がないかその値が数値へ変換できない場合は #fです。

Function: sxml:attr-u obj attr-name

{sxml.tools} 与えられたSXML要素objattr-nameという名前の属性への アクセッサです。objは、(通常はSXML要素の内容である) 属性リストやノードセットでも構いません。

戻り値は、その属性が存在すればその属性の値、与えられた要素に そのような属性がない場合は#fです。

-uが付くものは、正規化されていないSXMLノードに対しても 使えるということを示しています。(’u’は’universal’の意味です。)

Function: sxml:ns-list obj

{sxml.tools} 与えられた要素の名前空間のリストを返します。 ((sxpath '(@@ *NAMESPACES* *)) obj)と類似です。 名前空間のリストがない場合は空リストが返されます。

Function: sxml:ns-id->nodes obj namespace-id

{sxml.tools} SXML要素objで、与えられたnamespace-idに対応する名前空間の 連想リストのリストを返します。 ((sxpath '(@@ *NAMESPACES* namespace-id)) obj)と類似です。 与えられたnamespace-idに対応する名前空間の連想リストがない場合は 空リストが返されます。

Function: sxml:ns-id->uri obj namespace-id

{sxml.tools} 与えられたnamespace-idに対応するURIを返します。 与えられたnamespace-idに対応する名前空間の連想リストがない場合は #fを返します。

Function: sxml:ns-uri->id obj uri

{sxml.tools} 与えられた名前空間URIに対応する名前空間IDを返します。

Function: sxml:ns-id ns-assoc

{sxml.tools} 与えられた名前空間連想リストに対応する名前空間IDを返します。

Function: sxml:ns-uri ns-assoc

{sxml.tools} 与えられた名前空間連想リストに対応するURIを返します。

Function: sxml:ns-prefix ns-assoc

{sxml.tools} 与えられた名前空間連想リストに対応する名前空間接頭辞を返します。 与えられた名前空間IDの(XML文書における)オリジナルの接頭辞は、 それが名前空間IDと異なる場合は、名前空間連想リストの3番目の要素として 格納されなければなりません。 名前空間連想リストでオリジナルの接頭辞が省略されている場合は、 代わりに名前空間IDが使われます。


12.61.3 SXMLのモディファイヤ

正規化されたSXMLデータのコンストラクタやミューテータです。 これらの関数は、正規化されたSXMLデータに最適化されています。 任意の正規化されていないSXMLデータには適用できません。

ほとんどの関数には2つのバージョンがあります。

  1. 与えられた要素のその場での更新のために副作用が意図された関数。 これらの名前はエクスクラメーションマークで終わっています。 このバージョンの戻り値は、特に断りのない限り未定義です。 例としては、sxml:change-content!が挙げられます。
  2. 変更された要素を返す、副作用のない純粋な関数。 例としては、sxml:change-contentが挙げられます。
Function: sxml:change-content obj new-content
Function: sxml:change-content! obj new-content

{sxml.tools} 与えられたSXML要素の内容を、new-contentに変更します。 new-contentが空リストの場合は、objは空要素に変更されます。 結果のSXML要素は正規化されています。

Function: sxml:change-attrlist obj new-attrlist
Function: sxml:change-attrlist! obj new-attrlist

{sxml.tools} 結果のSXML要素は正規化されています。 new-attrlistが空の場合は、objのcadrは(@)になります。

Function: sxml:change-name obj new-name
Function: sxml:change-name! obj new-name

{sxml.tools} SXML要素の名前を破壊的に変更します。

Function: sxml:add-attr obj attr

{sxml.tools} 属性attrが追加されたSXML要素objを返します。 与えられた名前の属性がすでに存在する場合は#fを返します。 attr(attr-name attr-value)です。 sxml:add-attr!に対応する純粋関数的な関数です。

Function: sxml:add-attr! obj attr

{sxml.tools} 要素objに属性attrを追加します。 与えられた名前の属性がすでに存在する場合は#fを返します。 結果のSXMLノードは正規化されています。 sxml:add-attrに対応するその場で更新する関数です。

Function: sxml:change-attr obj attr

{sxml.tools} 属性attrの値が変更されたSXML要素objを返します。 与えられた名前の属性がない場合は#fを返します。 attr(attr-name attr-value)です。

Function: sxml:change-attr! obj attr

{sxml.tools} 要素objの属性の値を変更します。 attr(attr-name attr-value)です。 そのような属性がない場合は#fを返します。

Function: sxml:set-attr obj attr
Function: sxml:set-attr! obj attr

{sxml.tools} 要素objの属性attrをセットします。 そのような属性がない場合は新しい属性として追加されます。

Function: sxml:add-aux obj aux-node

{sxml.tools} 補助ノードaux-nodeが追加されたSXML要素objを返します。

Function: sxml:add-aux! obj aux-node

{sxml.tools} 要素objに補助ノードaux-nodeを追加します。

Function: sxml:squeeze obj
Function: sxml:squeeze! obj

{sxml.tools} 与えられたSXML要素objとその子孫について、空のリストである属性 および補助リストを排除します(最小化)。 最小化され、正規化されたSXML要素が返されます。

Function: sxml:clean obj

{sxml.tools} 与えられたSXML要素objとその子孫について、空リストである属性と、 全ての補助リストを削除します。 最小化され、正規化されたSXML要素が返されます。


12.61.4 SXPathの補助的ユーティリティ

これらは、SXPathの機能を拡張する便利なユーティリティです。

Function: sxml:add-parents obj . top-ptr

{sxml.tools} SXMLノードセットに’親へのポインタ’を追加したものを返します。 親へのポインタは、(*PARENT* thunk)というフォームを持つ 補助ノードです。thunkは親要素を返します。

Function: sxml:node-parent rootnode

{sxml.tools} 高速な’node-parent’関数を返します。 すなわち、SXML要素を1引数として取り、補助リストで *PARENT*ポインタを使ってその親ノードを返す関数を返します。 ’*TOP-PTR*はルートノードへのポインタとして使われます。 ルートノードに対して適用されると空リストを返します。

Function: sxml:lookup id index

{sxml.tools} 要素をそのIDを使って探します。


12.61.5 SXMLからマークアップへの変換

SXMLからXMLやHTMLなどのマークアップされたテキストを生成する手続き。 もっと高尚な変換器を得たいだけならば、 sxml.serializer - SXMLからXMLとXHTMLのシリアライゼーションをチェックして下さい。

Function: sxml:clean-feed . fragments

{sxml.tools} ’fragments’をフィルタします。 fragmentsは、文字列、文字、数値、手続き、#f、他のフラグメントの リストです。 この関数はツリーを深さ優先でトラバースし、 文字列、文字、実行された手続きのリストを返し、 #fと’()を無視します。

全ての意味のあるフラグメントは文字列で、 この関数の結果に(apply string-append ... )を 適用すると、そのstring-valueを返します。

これは、Oleg KiselyovのSRV:send-replyの変種であるとみなすことが できるでしょう。 SRV:send-replyはフラグメントを印字(display)しますが、 この関数は意味のあるフラグメントのリストを返し、ごみをふるい落とします。

Function: sxml:attr->xml attr :optional namespace-prefix-assig
Function: sxml:attr->html attr

{sxml.tools} 属性のXML/HTMLマークアップを作ります。 戻り値は、tree->stringwrite-treeに渡せる 文字列のツリーです(text.tree - 怠惰なテキスト構築参照)。

attrは2要素のリスト (attr-name attr-value)で、 attr-nameはシンボルでなければなりません。 attr-valueはどんな値でも良いですが、文字列以外は x->stringで文字列に変換されます。

省略可能なnamespace-prefix-assigは、属性名の名前空間プレフィクスを エイリアスに置き換えるのに使われます。 詳しくは下のsxml:sxml->xmlを参照してください。

二つの手続きには微妙な差があります。値が空文字列だった場合、 sxml:attr->htmlは値を省略しますが、sxml:attr->xmlはしません。

(use text.tree)

(tree->string (sxml:attr->xml '(name foo)))
 ⇒ " name=\"foo\""

(tree->string (sxml:attr->html '(value "He said, \"Oops.\"")))
 ⇒ " value=\"He said, "Oops."\""

(tree->string (sxml:attr->xml '(download "")))
 ⇒ " download=\"\""

(tree->string (sxml:attr->html '(download "")))
 ⇒ " download"

註: この手続きは元のsxml-toolsから、 属性値中の特殊文字をエスケープするのと、名前空間プレフィクスを認識するように変更してあります。

Function: sxml:string->xml string
Function: sxml:string->html string

{sxml.tools} string中の文字<>&"を 対応する文字実体参照に置き換えた文字列のツリーを返します。 sxml:string->xmlでは'も置き換えられます。

戻り値は、tree->stringwrite-treeに渡せます (text.tree - 怠惰なテキスト構築参照)。

text.html-lite - シンプルなHTMLドキュメントの構築html-escape-stringも参照して下さい。

Function: sxml:sxml->xml sxml :optional namespace-prefix-assig
Function: sxml:sxml->html sxml

{sxml.tools} SXMLをXMLあるいはHTMLにそれぞれ変換します。戻り値は文字列のツリーで、 tree->stringwrite-treeに渡せます (text.tree - 怠惰なテキスト構築参照)。

sxml:sxml->xmlは省略可能引数namespace-prefix-assigを取ります。 これはssax:xml->sxmlの同名の引数と同じく、 ((alias-symbol . namespace-string) …)という形の リストでなければなりません(SSAXの高レベルのパーザ - XMLからSXMLへ参照)。 これは次の二つの効果を持ちます。

  • sxmlのトップレベルのノードにxmlns属性を付加
  • ノード名や属性名のプリフィクスがnamespace-stringのいずれかと一致した場合、 対応するalias-symbolに置き換えられます (一致するものがなければプリフィクスはそのまま出力されます)。

sxml:sxml->htmlnamespace-prefix-assig引数を取りません。 HTMLには名前空間プレフィクスは無いからです。

XML版とHTML版の他の違いは次のとおりです。

  • 空の値を持つ属性の出力 (上のsxml:attr->xml/sxml:attr->html参照)
  • 文字実体参照に置き換えられる文字の違い (上のsxml:string->xml/sxml:string->html参照)
  • 終了タグのない要素。HTMLではいくつかの決められたタグは終了タグを持ちません。 XMLでは内容が空の要素は自己終了タグとして出力されます。
(tree->string (sxml:sxml->xml '(div (@ (foo "") (bar "'")))))
  ⇒ "<div foo=\"\" bar=\"&apos;\"/>"
(tree->string (sxml:sxml->html '(div (@ (foo "") (bar "'")))))
  ⇒ "<div foo bar=\"'\"/>"

(tree->string (sxml:sxml->xml '(img (@ (src "foo.png")))))
  ⇒ "<img src=\"foo.png\"/>"
(tree->string (sxml:sxml->html '(img (@ (src "foo.png")))))
  ⇒ "<img src=\"foo.png\">"
Function: sxml:non-terminated-html-tag? tag

{sxml.tools} この述語は、“終了タグのない”HTML 4.0のタグに対して#tを 返します。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT