xmlgenはTclの構文でXMLを生成するための拡張でTclXMLプロジェクトの一部です。
まずは ::xmlgen::declaretag コマンドでマークアップコマンドを作ります。 このコマンドをタグを生成するのに使います。
# delcaretag によるマークアップコマンドの生成
package require xmlgen
namespace import ::xmlgen::*
declaretag root
root - hello
このスクリプトを実行すると <root>hello</root> という出力が得られます。 マイナス記号は続く引数を要素の内容としてそのまま出力することを意味します。
マークアップコマンドの第1引数がattr=valueの形式をとっていた場合 そのタグの属性とみなされます。
# 属性を生成する
package require xmlgen
namespace import ::xmlgen::*
declaretag a
a href=http://purl.oclc.org/NET/jtclwiki/ - JapaneseTclWiki
このスクリプトを実行すると <a href="http://purl.oclc.org/NET/jtclwiki/">JapaneseTclWiki</a> という出力が得られます。
属性値がスペースを含む場合は全体を二重引用符か中括弧で囲みます。
# 空白を含む属性値
package require xmlgen
namespace import ::xmlgen::*
declaretag p
p {style=border: 2px solid grey} - Hello World
このスクリプトを実行すると <p style="border: 2px solid grey">Hello World</p> という出力が得られます。
先に導入したマイナス記号の部分は制御文字 (Control Character) と呼ばれ、 これが続く要素内容の評価の仕方を決定します。
制御文字がマイナス記号の場合は続く引数をそのまま要素の内容とします。 ただしスクリプトはTclインタプリタが解釈するのだということを忘れないでください。 変数や大括弧があればそれを評価して置換します。
# 変数の置換
# <h1>Writing XML</h1> と出力
package require xmlgen
namespace import ::xmlgen::*
declaretag h1
set title "Writing XML"
h1 - $title
# 大括弧の置換
# <tclver>8.4</tclver> などと出力
package require xmlgen
namespace import ::xmlgen::*
declaretag tclver
tclver - [info tclversion]
制御文字が感嘆符の場合、ボディ部が「実行」されます。 これによりタグの入れ子構造を表現することができます。
# タグの入れ子構造
# 出力は以下のとおり
# <table>
# <tr>
# <td>1</td>
# <td>2</td>
# </tr>
# <tr>
# <td>3</td>
# <td>4</td>
# </tr>
# </table>
package require xmlgen
namespace import ::xmlgen::*
declaretag table
declaretag tr
declaretag td
table ! {
tr ! {
td - 1
td - 2
}
tr ! {
td - 3
td - 4
}
}
制御文字がプラス記号の場合、ボディ部はTclの規則によって置換されます (substコマンドに渡されます)。 以下の例ではボディ部の $title という文字列を中括弧で囲んでいるので Tclインタプリタによる事前の置換は行われませんが、 制御文字を + にすることで置換を行うように指定しています。
# プラス記号の効果
package require xmlgen
namespace import ::xmlgen::*
declaretag h1
set title "Writing XML"
h1 - {$title}; # これは <h1>$title</h1> と出力
h1 + {$title}; # これは <h1>Writing XML</h1> と出力
ちなみにボディ部を中括弧で囲まなかった場合、二重に置換がなされてしまいます。
# ボディ部の二重置換
package require xmlgen
namespace import ::xmlgen::*
declaretag h1
set xml XML
set title {Writing $xml}
h1 - $title; # これは <h1>Writing $xml</h1> と出力
h1 + $title; # これは <h1>Writing XML</h1> と出力
Tclインタプリタによる置換は混乱を招きやすいので、 できるだけボディ部を中括弧で囲んでTclインタプリタによる評価を避け、 制御文字によってボディ部を評価するかどうかを明示的に決定するほうが好ましいでしょう。