<タグセットをつくろう/> XSLTsupportタグセット (とりあえず、固定回ループ程度は機能的に完成しているので、暫定的にwebにアップ。) 落としたxsltsupport.xsl.txt のファイル名はxsltsupport.xslに変更してください。 --------------------------------------------------------------------------- 目的 --------------------------------------------------------------------------- xslにあったらいいなという機能やxslのみでは実現出来ない機能をついかするタグセットをつくる。 ↓ ↓(現状) ↓ 今のところxslのみでの可能だけれど記述が複雑(固定回ループなど)や、xsl+でも 実現出来るもの(グローバルな変数)程度しか実装出来ていない状況。(^^; そのうち、DOMや(VB等の)外部処理系を駆使しないと実現出来ない機能もついかできたらいいな と、いう希望。 とりあえず、xslと組み合わせて使うという前提で作っているのでXSLTsupportのみで完全な言語にする予定は無し。 (xslと組み合わせればいい機能についてはxslにまかせる。 xmlのノードへのアクセスのみならばxslでほぼ充分と思うのでxslまかせ) --------------------------------------------------------------------------- 処理の流れと(いまのところの)使い方の例 --------------------------------------------------------------------------- (1)を含むスタイルシート(xsl1)をxsltsupport.xslで変換かけてxsl2を作る (2)目的のxmlをxsl2で変換する。 2段階の変換が必要になるので、IE上での関連づけ(↓)による動作は無理、 () htmlからのスクリプトなどで実現する例(VBscriptでの例) Set XMLDoc = CreateObject("Microsoft.XMLDOM") Set XSLSpt = CreateObject("Microsoft.XMLDOM") Set XSLDoc1 = CreateObject("Microsoft.XMLDOM") Set XSLDoc2 = CreateObject("Microsoft.XMLDOM") XMLDoc.async = false XSLSpt.async = false XSLDoc1.async = false XSLDoc2.async = false XMLDoc.load("test.xml") XSLSpt.load("xsltsupport.xsl") XSLDoc1.load("test.xsl") ret=XSLDoc1.transformNodeToObject(XSLSpt,XSLDoc2) div1.innerHTML=XMLDoc.transformNode(XSLDoc2) こんな(↑)感じ を含むスタイルシートの例 [下記のxmlの要素で5列*2行(行列数固定の表)を作成するxsl] ---x1.xml--- ---x1pre.xsl---(これをxsltsupport.xslで変換してx1.xslにする) 5×2の表
 
変換後のx1.xslはできればみないでほしい.... ただの強引な力技なのがバレバレ。(^^; --------------------------------------------------------------------------- 埋め込み言語としてのサンプル例など --------------------------------------------------------------------------- xslとの組み合わせと書いたが、それ以外のxmlファイルにタグを埋め込む形での 使用もやればできる。 xmlはxhtmlでもsvgでも整形式のxmlに準拠したものであれば可。 例(1) 九九の表を描画する(&階段状に青く装飾する)xhtml+XSLTsupport 九九
× =
例(2) 9×9の升目を表示するsvg+XSLTsupport (ただし、svgビューアーにはxsl処理の機能はないため、事前にxsltsupport.xslで変換した結果を ファイルに保存しておいてそのファイルを呼び出す。 以下、書きかけの仕様書 --------------------------------------------------------------------------- 仕様書 --------------------------------------------------------------------------- 要素: 書式: 機能: 繰り返しを行います。 カウンタ変数$@name$に@startを代入。 1ループごとに$@name$に@stepを加算。 $@name$の値が@endを越えるとループを抜けます。 属性: @name : カウンタ変数名 : 値 : 文字列 : ループ内で、変数$name$として使用出来ます。 @start : カウンタの初期値 : 値 : 数値(double) @end : カウンタ終了値 : 値 : 数値(double) @step : カウンタ増加値 : 値 : 数値(double) @stepは省略可能です。 省略時、@step=1となります。 備考: @start,@end,@stepには、$x$変数を含む式を指定可能。 ループを抜けた後、カウンタ変数は@endを初めて越えた値になります。 以下は不正な条件として、ループ内を1回も実行しません。 ・@stepが0 ・@start→@endの正負と@stepの正負が逆。(いくら@stepを加算しても@endに到達しない) --------------------------------------------------------------------------- 要素: 書式: (1) (2) 機能: xslspt変数$name$を含む式を計算し値を返します。 $name$は変数値に置き換えられた後、計算が行われます。 (例) $i$が5の時 は20に置き換えられます。 属性: @select : 演算式 : 式を記述します。 @selectと子要素のテキスト要素が両方ある場合、@selectの方が優先され、テキスト要素は無視されます。 備考: 存在しない(今までに1度も定義されていない)変数が式に含まれている場合、その変数は展開されません。 $name$変数が置き換えられた後の計算はvbscriptのeval関数で行われます。 そのため記述出来るvbscriptの関数などもありますが、基本的には四則演算のみのサポートで、vbscriptの関数による 演算は将来的には動作保証外(未サポート)です。 --------------------------------------------------------------------------- 要素: 書式: テンプレート 属性: @name 追加する属性の名前。 機能: の親のタグに属性を追加する。 例: position() = 上記は変数iが3の時には に置き換えられる。 別書式: 以外のタグ(出力されるタグ)の属性に、${式}$ので記述された部分がある時は、式を計算した結果と置き換える。 例: は変数iが3の時には に置き換えられる。 --------------------------------------------------------------------------- 要素: 書式: (1) (2) 機能: グローバルな変数。 記述場所(テンプレートの内外)に関係なく、一旦設定された変数はどこからでも呼び出すことが出来ます。 書式(1)(2)のxslspt変数($変数名$)を含む式を計算し、計算結果の値を変数に代入します。 $name$は変数値に置き換えられた後、計算が行われます。 (例) $i$が5の時 $x$に20を代入します。 文字列を設定する場合はダブルコーテーション「"(あるいは")」で囲みます。 (例) (1) (2) (3) 上記(1)〜(3)はいずれも等価です。 "〜"の間に記述された変数($変数名$)も展開されます。 属性: @name : 変数名 : 値 : 文字列 @select : 演算式 : 式を記述します。 @selectと子要素のテキスト要素が両方ある場合、@selectの方が優先され、テキスト要素は無視されます。 --------------------------------------------------------------------------- 変数の書式の例 変数は$変数名$で記述される。 例: で設定された変数xは、それ以降に、「$x$」にて参照される。 --------------------------------------------------------------------------- 要素: 書式: テンプレート 機能: @testの式が真(true)の時に間のテンプレートを出力/実行 属性: @test : 式 : 例 変数iが4 かつ、変数sが'moji'という文字列でないという条件 式はJscriptに準拠した記述。 注意点として、 ・等しいは「=」でなく「==」 ・AND条件は「&&」であるが、属性内のため「&&」と記述。 --------------------------------------------------------------------------- 要素: 書式: 「開始タグを出力する」xslを出力します。 output-xslt="no"が指定されている場合は、xslではなく直接開始タグを出力します。 [[暫定仕様]] 属性については、 の様にnameに記述する @nameと別属性@attributeに分けるかは検討中。 --------------------------------------------------------------------------- 要素: 書式: 「終了タグを出力する」xslを出力します。 output-xslt="no"が指定されている場合は、xslではなく直接終了タグを出力します。 --------------------------------------------------------------------------- 要素: 書式:(1)文字に置き換える 置換対象テンプレート 書式:(2)ノードに置き換える 置換対象テンプレート 置き換えるノード 属性: @match : 置換対象を示す正規表現文字列 : (例)match="a[a-zA-Z]+b" @replace-string : 置き換える文字列。Jscriptの正規表現置換に準拠した書式が可能。 : (例)replace-string="a href='$1'" @option : 正規表現のオプション。 g(対象を全て置換)とi(大文字小文字を区別しない)が指定可能。 : (例)option="gi" : 省略可能。 @pattern : 置換対象になるノードのXPathを指定。 : 省略時は"//text()|//@*"全てのテキストノードと全ての属性が対象になる。 : 省略可能。 @output-xslt : 置換対象テンプレートを置換するためのxsltを出力するかの指定。 "no"の時は置換するためのxsltではなく直接置換結果を出力する。 : 省略可能。 子要素: xslspt:original-node : 置換対象テンプレートを子要素に持つ。 xslspt:replace-node : 置き換えるノードを子要素に持つ。 機能: 置換対象テンプレートに含まれるテキストノード、属性値を置換するxslを出力します。 (正規表現@matchに一致するものを@replace-stringで置き換える。) 制限: の置換対象にdisable-output-escaping="yes"属性が指定してある により生成したタグ()が含まれている場合、disable-output-escaping="yes"が無視されるためタグ「」は単なる 文字列「<x/>」として扱われます。 同様の理由により、disable-output-escaping="yes"機能を利用しているが 生成するタグもdisable-output-escaping="yes"が無視され、単なる文字列として扱われてしまいます。 --------------------------------------------------------------------------- --------------------------------------------------------------------------- 制限事項: XSLTsupportが自動的に"xslspt"で始まる「テンプレート」「名前空間」「変数」を 追加する場合があるので、重複しないようユーザー(あなた)定義のモノには"xslspt" で始まる名前を使用しない様願います。 ---------------------------------------------------------------------------