「wiki.xsl」スクリプトの動作
整形を行う「wiki.xsl」はXSLTというスクリプト言語で書かれています。XSLTはXML変換用のスクリプト言語で、変換対象の文章を先頭から走査し「このタグを見つけたときはこの動作を行う」というような形で記述されます。「wiki.xsl」では次のような動作を行っています。
- ドキュメントルート(XML文章の一番上位のタグ)を見つけたら、
<head>
の中の<rule>
を探しだし、内容に基づいてルールを登録する。<xsl:template match="/"> <xsl:value-of select="xmlns:addRule(./html/head/rule)"/> <xsl:apply-templates/> </xsl:template>
2行目の<xsl:value-of ... >
で、独自に定義したJScriptの関数addRule
を呼び出しています。// 使用するルールのリスト var ruleList = new Array(); ... // ルールの登録 function addRule(nodeList) { for(var i=0; i<nodeList.length; i++) { var node = nodeList.item(i); // ルールの作成(変換規則) var o = new Object(); ... // ルール追加 ruleList.push(o); } return ""; }
addRule
は引数で渡された<rule>
のリストに従って整形ルールを生成し、配列ruleList
に格納します。
<rule>
を見つけたら無視する(ドキュメントルートで既にルールの登録を行っているため)。<xsl:template match="rule|processing-instruction()"/>
<wiki>
を見つけたら、内容をルールに基づいて変換し、出力する。<xsl:template match="wiki"> <xsl:value-of select="xmlns:format(.)" disable-output-escaping="yes"/> </xsl:template>
ドキュメントルートの時と同じく、2行目の<xsl:value-of ... >
で、独自に定義したJScriptの関数format
を呼び出しています。// テキスト整形を行う function format(nodeList) { // 対象ノード var node = nodeList.item(0); // 対象文字列の取得 var str=""; ... // 変換開始 ... // エスケープ ... // 空白を生かす ... // 使用するグループを取得 var group = node.getAttribute("group"); if(!group) group=""; // 置き換え for(var i=0; i<ruleList.length; i++) { ... } // タグの外側の空白を変換 ... // タグの外側の改行を変換 ... // 属性のコピーを行う ... // 出力する var out = "<div" + attrStr + ">" + str + "</div>"; return out; }
format
はaddRule
で生成したルールをもとに、引数で渡された<wiki>
の中身を整形して返します。
- その他のタグや属性を見つけたら、そのまま出力する。
<xsl:template match="@*|node()" priority="-1.0"> <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> </xsl:template>
整形結果をファイルに書き出す
Internet Explorerで確認した整形結果を、msxslコマンドを使用してファイルに書き出すことができます。msxslコマンドはMSXMLがインストールされていないと使用できないので注意してください。
コマンドプロントで
msxsl 変換元XHTMLファイル名 wiki.xsl -o 変換先ファイル名
とすると変換結果をファイルに書き出すことができます。
また、MSXMLのバージョンが4.0以上なら
msxsl 変換元XHTMLファイル名 -pi -o 変換先ファイル名
として、wiki.xslの指定を省略することができます。関連付けで「.xml」の右クリックメニューから次のようなバッチファイルを呼び出せるようにすれば、「ファイルを右クリック」→「toHTML」で変換結果をファイルに出力できるようになります。
@ECHO off C:\WINNT\system32\msxsl.exe %1 -pi -o "%~dpn1.html"
<msxsl:script>
はバージョン3.0とバージョン4.0で仕様が変更されています。新しいバージョンのMSXSLをインストールすると、古いバージョンで実行できていた変換が実行できなくなることがあります(その際、ブラウザで見る時は変換が成功しますが、msxslコマンドを使用すると変換に失敗します)。この問題は変換の際に-u 3.0
とオプションを指定することで解決することができます。ただし、-u 3.0
と-pi
を同時に指定することはできません。まとめ
「記号による整形」は、文章の様式が固定されている時に効果を発揮します。自分で必要最低限の整形ルールを指定しながら文章を書いていくと、統一のとれたデザインの文章を作成することができます。
また、XSLTスクリプトを使用すると、本来HTMLに存在しないタグがあたかも存在するかのように振舞わせることができます。Wiki整形を行う<wiki>
タグのほかにも、画像サムネイルを生成するタグや、フォルダ内のHTMLファイルの目次を生成するタグなど、「XSLT+JScript」の組み合わせでさまざまな自分用のタグを作成することができます。
ぜひ、皆さまのドキュメントライフにご活用ください。
参考文献
- XSLT
- @IT 『サンプルで覚えるXSLTプログラミング』 小山尚彦・Chienowa.comチーム 著、2000年10月
- @IT 『ファイル出力とXSLT機能拡張』 奥井康弘・吉田稔・青木秀起 著、2002年3月
- 『Studying XML for beginners』 A. Okazaki 著、2003年6月
- 『<xsl:script>/<msxsl:script>関数への引数についての覚え書き』 a.hanai 著、2001年6月
- JScript
- MSDN 『JScript』
- DOM
- MSDN 『DOM Reference(英語)』
- W3C勧告 『文書オブジェクトモデル(DOM)第1水準 仕様書』 1998年10月