11. 変換言語 この11.はDSSSLの変換言語を規定する。DSSSL変換言語は,データの内容記法となる。この記法を用いる要素の内容は,構文transformation-language-bodyとして解析する。 [151] transformation-language-body = [[unit-declaration* | added-char-properties-declaration* | character-property-declaration* | transliteration-map-definition* | language-definition* | default-language-declaration? | definition* | association*]] 変換言語は,8.で定義する式言語及び,10.で定義するSDQLを利用する。 変換処理は,単一のグローブを入力として要求し,構文associationの指定とおりに変換する。関連は他のグローブも変換してよい。変換中のグローブは,現グローブとして参照する。 11.1 機能 次にあげる機能は,変換言語でオプションとなっている。 (1) 機能combine-charは,要素型形式character-combination-declarationを利用可能とする。 (2) 機能keywordは,構文formal-argument-list内で#!keyを利用可能とする。 (3) 機能multi-sourceは,手続きtransform-groveを利用可能とする。 (4) 機能multi-resultは,複数の結果グローブを出力可能とする。 (5) 機能regexpは,10.3.2で定義するノード正規式を利用可能にする。 (6) 機能wordは,10.3.1で定義する語検索を利用可能にする。 (7) 機能hytimeは,10.2.1で定義するHyTimeの所在番地づけを利用可能にする。 (8) 機能charsetは,要素型形式char-epertoire,要素型形式combine-char,要素型形式features及び要素型形式sgml-grove-plan以外の宣言要素型形式を利用可能にする。 11.2 関連 変換処理は,関連の集合を用いて指定する。 [152] association = (=> query-expression transform-expression priority-expression? ) [153] query-expression = expression [154] transform-expression = expression [155] priority-expression = expression 各関連は,3つまでの構成要素をもつ。 (1) ノードリストを返却する照会式。この照会式はノードリストを返却し,そのノードリスト内のノードが,関連を適用する候補となる。 (2) 関連を適用するノードのそれぞれについて評価する変換式。返却値は,結果グローブ内ノード(複数も可能)に関する記述であって,それらは入力グローブで選択したノードに対応する。 (3) オプションの優先順位式は,関連を適用する候補ノードの適用の判断に影響する。 式query-expressionは,評価の結果ノードリストとなる。式query-expressionが返却したノードリスト内のすべてノードは,現グローブ又は現グローブに由来する補助グローブのノードとなる。補助グローブは,9.5で定義する。式query-expression内の手続きcurrent-rootは,現グローブの根を含む単一要素ノードリストを返却する。 式priority-expressionは,評価の結果整数となる。数値は,関連の優先順位を定義する。関連において式priority-expressionが省略された場合,その関連の優先順位を0とする。数値が大きい方が,より優先度が高いことを示す。 関連を適用する可能性のある各ノードは,現グローブ内に構成要素集合をもつ。ノードが現グローブ内にある場合,構成要素集合はそのノードだけを含む。ノードが補助グローブ内にある場合,構成要素集合はその補助グローブ内のノードの入力特性の値として出現する現グローブ内のノードを含む。関連は,実際には候補となった任意のノードnに適用できる。しかし,ノードnの構成要素集合内のノードを構成要素集合としてもつノードがあり,そのノードにより高い優先順位の関連を適用する場合には,先の関連は適用可能ではない。 11.3 変換式 式transform-expression内において手続きcurrent-nodeは,変換中のノードを含む単一要素ノードリストを返す。各変換式は,型create-spec,型transform-grove-spec,型create-spec若しくは型transform-specからなるリスト又は空リストを返す。型create-specの各オブジェクトは,結果グローブ内の指定した位置への部分グローブの作成を記述する。部分グローブは,ノード又はノードを根とした複数のノードからなる。部分グローブを生成する位置は,結果グローブの根又は結果グローブ内の他のノード相対で指定できる。結果グローブ内で生成した各ノードについて,変換によって結果グローブにノードを生成した組成要素のそれぞれから,生成されたノードへの対応関係が生成される。これらの対応関係を矢と呼ぶ。矢は式言語オブジェクトを用いてラベル付けする。矢の開始点は,終点の変換起点と呼ぶ。入力グローブ内のノードの矢は,そのノードが変換の結果どこに行くかを示す。矢のラベルは一つのノードに適用された,複数の異なる変換を区別可能にする。ノードの変換式は,作成した部分グローブの行き先として,結果グローブの根を指定するか又は他のノードの変換結果の結果グローブ内のノードに相対での位置 を指定する。 11.3.1 部分グローブ指定 作成する部分グローブは,型subgrove-specのオブジェクトを用いて記述する。 (subgrove-spec #!key node: subgrove: class: add: null: remove: children: sub: label: sort-children:) 手続きsubgrove-specは,型subgrove-specのオブジェクトを返す。 引数node:は単一要素ノードリストとする。この引数は,作成する部分グローブの根ノードが,引数node:の値と同じクラスのノードであって,引数node:の値と同じ非ノード型・非内在型の特性をもち,引数node:の値と同じヌル値を値とする特性をもつと指定する。ただし,非ノード型・非内在型の特性は引数add:及び引数remove:によって変更を受け,ヌル値を値とする特性は引数null:及び引数remove:によって変更を受ける。 引数subgrove:は,単一要素ノードリストとする。この引数は,作成される部分グローブが引数ノードを根とする部分グローブの複製となると指定する。 引数class:はシンボルであって,作成するノードのクラスを指定する。引数node:,引数subgrove:及び引数class:の一つだけを指定しなければならない。 引数add:は,非ノード型・非内在型であってヌル値を値としない特性をノードへ追加することを指定する。引数add:は二つの要素をもつリストのリストとし,その要素リストの第一要素は特性の名前とし,第二要素は特性の値とする。特性はそのノードのクラスのもつ非ノード型・非内在型の特性とする。引数add:で指定した特性値は,引数node:に指定されたノードのもつ任意の特性の値を置換する。 引数null:はシンボルのリストであって,そのノードに指定した名前へのヌル値をもつ非内在特性の追加を指定する。この指定は引数node:で指定されたノードがもつ非ヌル値特性を置換する。 引数remove:は,引数node:で指定されたノード及び作成されるノードがもつ非内在特性のリストとし,空リストを無指定時値とする。この引数はヌル値を値とする特性及びヌル値を値としない特性の両方の削除に利用できる。 引数sub:は,手続きsubgrove-specが返す部分グローブの根ノードのための下位ノードを指定するリストとする。リストの要素は,最初の要素が部分ノード特性の名前を指定するシンボルであって,残りの要素が特性の値として指定するノードのための,複数の型subgrove-specのオブジェクトとする。この引数は空リストを無指定時値とする。 引数children:は型subgrove-specのオブジェクトのリストであって,手続きsubgrove-specの返す部分グローブの根ノードの子ども特性の値としてそれらのノードを指定する。 備考 これらは引数sub:を用いて指定することもできるが,引数children:を用いる方が通常は簡便である。 この引数は空リストを無指定時値とする。 引数label:は矢のためのラベルを指定し,その矢は入力グローブの変換したノードから,結果グローブ内に作成中の部分グローブの根にあたるノードへ作成される。ラベルは任意の式言語オブジェクトでよい。無指定時値は,#fとする。 引数sort-children:は根ノードの子の順序に影響する手続きとする。11.3.2を参照のこと。 クラス及び特性はSGML特性集合で定義するとおり,10.1.5 に記述のある通常変換を伴う応用名によって名付ける。 11.3.2 生成指定 (create-spec? obj) 手続きcreate-specは,引数objが型create-specの場合に#tを返し,その他の場合に#fを返す。 (create-root obj sg) 結果グローブの根の生成を指定する型create-specのオブジェクトを返す。引数sgは結果グローブの根を指定する型subgrove-specのオブジェクトとする。引数objは結果グローブの識別子とする。 (create-sub snl sg #!key property: label: result-path: optional: unique:) (create-preced snl sg #!key label: result-path: optional: unique:) (create-follow snl sg #!key label: result-path: optional: unique:) 手続きcreate-sub,手続きcreate-preced及び手続きcreate-followは,引数snlを開始点とし引数label:でラベルされた各矢ごとに,引数sgで指定した部分グローブの結果グローブにおける作成の指定を行う。手続きcreate-sub,手続きcreate-preced又は手続きcreate-followの評価は,それ自体では結果グローブへのノードの作成を引き起こさない。変換式以外が返却した型create-specのオブジェクトは無視する。 引数label:は任意の式言語オブジェクトであってよく,無指定時値#fをとする。 引数optional:の値が#fの場合,指定した矢が存在しない場合にはエラーとする。引数optional:は#fを無指定時値とする。 引数result-path:は手続きであって,各矢においてその終点を一意要素とする結果ノードリストに適用する。引数result-path:の手続きは,グローブの構築の際に様々な点で結果ノードリストに適用される。グローブ構築のある時点で,手続きは要素を一つだけ含む結果ノードリストを返さなければならない。これが生成起点となる。この手続きはどの時点でも,二つ以上の要素を含む結果ノードリストを返してはならない。引数result-path:が指定されない場合,同じ値を返す手続きを無指定時値とする。 手続きcreate-subにおいて,引数property:はシンボル又は文字列であって,特性名を指定する。この特性は生成起点の部分ノード特性となり,部分グローブは生成起点のその特性の要素として作成される。引数property:が省略された場合,生成起点の子ども特性を無指定時値とする。生成起点が子をもたない場合には,省略してはならない。手続きcreate-precedでは,部分グローブは生成起点の先行する兄弟として生成される。手続きcreate-followでは,部分グローブは生成起点の後続する兄弟として生成される。 二つの部分グローブにおいて,部分グローブの根がともに同じ生成起点,同じ生成手続きである場合にだけ,二つの部分グローブは同じ生成法と呼ぶ。ただし,生成手続きが手続きcreate-subの場合には,同じ特性propnameをもたなければならない。 引数unique:が値#fでない場合,この部分グローブは同じ生成法で生成される一意部分グローブでなければならない。引数unique:は,値#fを無指定時値とする。 引数unique:が値#fをもたない場合,同じ生成法で生成される部分グローブの相対順序は,部分グローブの生成順とは独立に決定する。あるノードを生成起点として手続きcreate-follow又は手続きcreate-precedによって生成した兄弟を,ノードに直接依存する兄弟をと呼ぶ。あるノードに直接依存する兄弟及び直接依存する兄弟に依存する兄弟をノードに依存する兄弟をと呼ぶ。同じ生成手続き及び同じ生成起点によって生成されたノードを作成中の部分グローブの生成兄弟と呼ぶ。さらに,部分グローブが手続きcreate-subを用いて挿入された場合,挿入された部分グローブの兄弟となるノード及び起点ノードと同じ部分グローブの一部として生成された任意のノードを生成兄弟として扱う。部分グローブを挿入する位置を,最初に生成兄弟との相対で決定する。次に部分グローブが後続しなければならない生成兄弟の依存する兄弟すべてに後続し,部分グローブが先行しなければならない生成兄弟の依存する兄弟すべてに先行する位置に挿入する。その結果,その部分グローブとその生成起点の間にノードは存在しない。ただし,その生成起点は生成兄弟,生成兄弟の依存する兄弟のいずれかであってはならない。 部分グローブの根ノードが,部分グローブの起点ノードの子となる場合,その部分グローブの生成兄弟内での位置は,起点ノードの順序判定に従う。順序判定は手続きであって,手続きsubgrove-specの引数sort-children:に指定する。順序判定には,比較する変換起点,つまり二つの結果グローブ内のノードが渡される。順序判定は,最初のノードが二番目のノードに先行する場合に真を返す。順序判定が指定されない場合,手続きtree-before?を順序判定として用いる。この場合,部分グローブの変換起点及びその生成兄弟すべてが同じ木になければエラーとする。部分グローブの根ノードが起点ノードの子でない場合,部分グローブのその生成兄弟内での位置は,順序判定として手続きgrove-before?を指定したこの場合と同じ方法で決定する。 矢は他の矢の契機となる場合がある。それは第二の矢が,第一の矢の開始点を最初の引数に,第一の矢のラベルを引数label:に指定している生成手続きによって生成された場合とする。複数の矢が連鎖して各矢が次の矢の契機となり,最後の矢が最初の矢と同じ開始点及びラベルをもつ場合はエラーとなる。 備考 この要求は無限ループの可能性を避けるためのものである。 11.3.3 結果ノードリスト 型result-node-listは,結果グローブ内のノードのリストを表わす。型result-node-listのオブジェクトには,型node-listに適用可能な演算の部分集合が適用できる。手続き原型では,引数名rnlが型result-node-listを示す。 備考 適用可能な演算は,結果グローブ内ノードが結果グローブ構成のある時点で式を評価した結果として得られる結果ノードリストに含まれる場合,結果グローブを構成するそれ以降の任意の時点において,その式を評価した結果にはそのノードが含まれていることを保証するよう設計されている。 (node-list-union rnl ...) (node-list-intersection rnl ...) (children rnl) (attributes rnl) (preced rnl) (follow rnl) (parent rnl) (ancestors rnl) (descendants rnl) (origin rnl) (select-by-class rnl sym) (select-by-property rnl sym proc) (select-by-null-property rnl sym) (select-by-missing-property rnl sym) これらの手続きは,対応する型node-listに対する演算と同様に振る舞うが,返す値は型node-listではなく型result-node-listとなる。 (select-by-relation rnl i proc) 手続きselect-by-relationは,引数rnlに含まれるノードであって,そのノードだけを含む結果ノードリストに,引数の手続きprocを適用した結果が,引数i個以上の要素をもつ結果ノードリストを返すノードを含む,結果ノードリストを返す。 例えば,次の式は,子ノードから共通識別子にparaをもつ要素を子孫にもつノードを選択する。 (lambda (x) (select-by-relation (children x) 1 (lambda (y) (select-elements (descendants y) "para")))) (select-by-attribute-token rnl string1 string2) 引数rnl内のノードであって,その属性がクラスattribute-value-tokenを子にもち,そのクラスattribute-value-tokenの子として特性tokenをもち,その値と引数string2に適用可能な文字列正規化を施した結果が等しいノードを含む結果ノードリストを返す。 11.3.4 変換グローブ指定 型transform-grove-specのオブジェクトは,現在のグローブに加えて変換されるグローブを示す。 (transform-grove-spec? obj) 引数objが型transform-grove-specの場合に#tを返し,それ以外の場合に#fを返す。 (transform-grove snl obj ...) 引数snlはグローブ根とする。手続きtransform-groveは,引数snlから新規のグローブを生成して,特性transform-argsをグローブ根に追加し,その値となるリストにobj,...を含め,新規のグローブの変換を指定する型transform-grove-specのオブジェクトを返す。 (select-grove nl obj) 引数nlの要素であって,そのグローブ根が特性transform-argsをもち,その要素がobjに等しいものを選択する。 11.3.5 SGML前書き解析 (sgml-parse-prolog string) SGML文書の前書きを解析することによって構築されるグローブ根ノードをだけを含むノードリストを返す。引数stringは,SGML文書実体のシステム識別子とする。このグローブは無指定時のグローブ設計を変更してモジュールinstabsを除外して構築する。 備考 この手続きは,典型的には入力と出力が異なるDTDを用いる場合に,手続きsubgrove-spec:の引数subgrove:を指定するために用いる。 11.4 SGML出力処理 SGML出力処理は,結果グローブからSGML文書又はSGML副文書を生成する。SGML出力処理の動作は,検証グローブとの関連で指定する。検証グローブは,結果グローブをSGML特性集合の,すべてのクラス及び特性を含んだグローブ設計を用いて生成したSGML文書又はSGML副文書を解析することによって構築される。 備考 実装は検証グローブを構成することを要求されない。 結果グローブは,その結果グローブから,11.4.1に記載の要求を満たす検証グローブへの検証対応が存在し,適合SGML文書又は適合SGML副文書を生成できる場合に適正と呼ぶ。結果グローブが適正な場合,実装はそのSGML文書又はSGML副文書を生成する。実装は結果グローブが不正であることは,結果グローブが不正の場合にだけ報告する。 11.4.1 検証対応 すべての結果グローブは,次の要求を満たす。 (1) 結果グローブのノードは,下位ノード特性以外には,宣言データ型が型nodalの特性の値を開示しない。 (2) 結果グローブ内のノードは,区分derivedに含まれる特性の値は開示しない。 検証対応Vは,結果グローブの各ノードを検証グローブのノードに対応させる。ノードV(n)は,検証対応Vをノードnに適用した結果を意味する。特性値n[p]は,ノードnが特性pについて開示している値を示す。検証グローブ内のノードn'は,ノードV(n)がノードn'となる結果グローブ内のノードnが存在する場合にだけ,基盤をもつと呼ぶ。 検証対応Vは,次の要求を満たさなければならない。 (1) ノードnが結果グローブ根であった場合,ノードV(n)は検証グローブ根となる。 (2) 結果グローブ内の相異なるノードm及びノードnにおいて,ノードV(m)とノードV(n)とが異なる。 (3) 結果グローブの各ノードnにおいて,ノードV(n)はノードnと同じクラスをもつ。 (4) 結果グローブ内の各ノードn及びノードV(n)がヌル値を開示する非ノード型・非内在型と宣言された各特性pにおいて,ノードnは特性pが区分derived又は区分optionalではない場合,特性pに関してヌル値を開示する。 (5) 検証グローブ内のノードは,そのクラスが属性値mayaddをもち及び次のいずれかの場合に基盤をもつ。 (a) 兄弟のいずれかが基盤をもつ。 (b) 又は (ア) ノードの起点が基盤をもち, (イ) 起点の,起点から下位ノード関係特性が区分optionalでない。 (6) 結果グローブの各ノードn及びnがヌル値を開示している非内在特性pにおいて,ノードV(n)は特性pに関してヌル値を開示する。 (7) 結果グローブ内の各ノードn及びノードnが非ヌル値を開示している各非ノード型特性pにおいて,特性値n[p]の特性集合によってその特性に指定された,適用可能な文字列正規化を適用した後の値は,特性値V(n)[p]に等しい。 (8) 結果グローブの各ノードn及びnが非ヌル値を開示するノード型と宣言された各部分ノード特性pにおいて,V(n)[p]はV(n)[p]に等しい。 (9) 結果グローブの各ノードn,ノードnが非ヌル値を開示する,抽象データ型が型nodelist又は型nmndlistと宣言された各下位ノード特性及び特性値n[p]内の各ノードsにおいて,ノードV(s)は特性値V(n)[p]に属する。 (10) 結果グローブ内の各ノードn及びノードnが値を開示する,抽象データ型が型nodelistと宣言した下位ノード特性及び特性値n[p]内に存在する任意のノードr及びノードsにおいて,ノードrがノードsに結果グローブ内で先行する場合,検証グローブ内でノードV(r)はノードV(s)に先行する。 特性transliteration(11.4.2に記載)は,検証対応では考慮しない。これらの規則の例外として,検証グローブ内のクラスがクラスattribute-assignmentのノードは,SGML宣言に適用するISO 8879の規則においてSHORTTAG YESの指定があり,属性値の指定が必要ではない場合には,基盤をもつ必要はない。 11.4.2 文字変換 [156] transliteration-map-definition = (define-transliteration-map variable transliteration-entry ) [157] transliteration-entry = ( character character-list ) [158] character-list = ( character+ ) 構文transliteration-map-definitionは,変数variableを型transliteration-mapのオブジェクトに束縛する。型transliteration-mapは,特定の文字列を一つ以上の文字列で表現する文字変換を指定する。各構文transliteration-entryは,最初の文字が構文character-list内の文字列で表現することを指定する。 (transliteration-map? obj) 引数objが型transliteration-mapの場合に#tを,その他の場合に#fを返す。 結果グローブ内の各ノードは,その値が型transliteration-mapのオブジェクトの非ノード型の特性tranliterationをもってよい。ノードに特性transliterationが指定されない場合,特性transliterationの値はノードの起点の値となる。結果グローブの根ノードに特性transliterationが指定されない場合,その値は空の文字変換対応となる。 同じ文字変換対応特性をもつ,結果グローブ内の一連のノードdata-charに関して,文字変換対応と関連して結果グローブ内の文字列を表わす文字列が,結果グローブ内の一連の文字の代わりに出力される。曖昧な場合には,最も長い構文tranliteration-entryを用いる。