SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Wikiのように独自タグでHTML整形を行う

MSXMLのXSLTを利用した独自記号による文章整形

  • X ポスト
  • このエントリーをはてなブックマークに追加

「wiki.xsl」スクリプトの動作

 整形を行う「wiki.xsl」はXSLTというスクリプト言語で書かれています。XSLTはXML変換用のスクリプト言語で、変換対象の文章を先頭から走査し「このタグを見つけたときはこの動作を行う」というような形で記述されます。「wiki.xsl」では次のような動作を行っています。

  1. ドキュメントルート(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に格納します。
  1. <rule>を見つけたら無視する(ドキュメントルートで既にルールの登録を行っているため)。
    <xsl:template match="rule|processing-instruction()"/>
    
  1. <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;
    }
    
    formataddRuleで生成したルールをもとに、引数で渡された<wiki>の中身を整形して返します。
  1. その他のタグや属性を見つけたら、そのまま出力する。
    <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のバージョンについて
 MSXSLの<msxsl:script>はバージョン3.0とバージョン4.0で仕様が変更されています。新しいバージョンのMSXSLをインストールすると、古いバージョンで実行できていた変換が実行できなくなることがあります(その際、ブラウザで見る時は変換が成功しますが、msxslコマンドを使用すると変換に失敗します)。この問題は変換の際に-u 3.0とオプションを指定することで解決することができます。ただし、-u 3.0-piを同時に指定することはできません。
 

まとめ

 「記号による整形」は、文章の様式が固定されている時に効果を発揮します。自分で必要最低限の整形ルールを指定しながら文章を書いていくと、統一のとれたデザインの文章を作成することができます。

 また、XSLTスクリプトを使用すると、本来HTMLに存在しないタグがあたかも存在するかのように振舞わせることができます。Wiki整形を行う<wiki>タグのほかにも、画像サムネイルを生成するタグや、フォルダ内のHTMLファイルの目次を生成するタグなど、「XSLT+JScript」の組み合わせでさまざまな自分用のタグを作成することができます。

 ぜひ、皆さまのドキュメントライフにご活用ください。

参考文献

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ひだちのいろ(ヒダチノイロ)

大学生。IT関係の仕事につくのが夢です。かやねずみの巣

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/865 2008/08/26 13:36

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング