xmlでxhtmlを生成する

  1. xmlからhtmlを生成する


    1. 文献

      このプログラムソースは、大田一郎:「XMLツールキット」、SHUWA System からの引用です。

    2. xmlと情報抽出

       xml は自由な「タグ」を利用した、タグ形式の記述言語(形式)です。記述内容に即した自由なタグを指定して、階層的な記述ができます。以下は、ホームページの更新記録の xml 記述です。更新項目を <news>タグ、その構成要素の日付を内容を <date>タグと<text>タグで記述しています。
          <news>
              <date>2001/03/01</date>
               <text>
                     日記をつけはじめました.
                </text>
          </news>
          <news>
              <date>2001/02/01</date>
              <text>
                 ホームページを立ち上げました
              </text>
          </news>

       実際のhtml 記述は表形式で表現すると、例えば、以下のようになります。
          <div class="news">
            <h2>更新情報</h2>
            <table border="0" cellpadding="3" cellspacing="3">
              <tr><th>更新日</th><th>内容</th></tr>
              <tr>
                <td>2001/03/01</td>
                <td>日記をつけはじめました.</td>
              </tr>
              <tr>
                <td>2001/02/01</td>
                <td>ホームページを立ち上げました</td>
              </tr>
            </table>
          </div>

       html は記述内容と表現形式の分離は不完全なため、htmlから正確な情報抽出を行うことは不可能です。たとえば、「日付 2001/03/01 の更新記録 を取り出す」、場合 2001/03/01  と news をキーにすれば 抜き出し できそうですが、これも、<div> の class に頼っており、この記述がなければ、2001/03/01 キーで抜き出すしかありません。この場合、2001/03/01を含む すべての情報が抽出されてしまいます。
       xml はタグに「意味付け」が明確になっていれば、正確な階層的情報抽出が可能です。

    3. 生成するxhtml

      以下は参考例とするあるホームページの先頭ページの 記述です。

      frontpage.html
      <!--frontpage.html -->
      
      <?xml version="1.0" encoding="Shift_JIS" ?>
      
      <!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "DTD/xhtml1-strict.dtd">
      
      <!--
              えーさんのページ:フロントページ
      -->
      
      <html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
      
        <head>
          <link href="../css/frontpage.css" rel="stylesheet" type="text/css" />
          <meta content="text/html; charset=Shift_JIS" http-equiv="Content-Type" />
          <title>えーさんのページ</title>
        </head>
      
        <body>
      
          <h1><img src="../images/title.gif" alt="" /></h1>
          <hr />
      
          <!-- 更新情報:新しいものを上に書く -->
      
          <div class="news">
            <h2>更新情報</h2>
            <span class="detail"><a href="./update.html">詳細はこちら</a></span>
            <table border="0" cellpadding="3" cellspacing="3">
              <tr><th>更新日</th><th>内容</th></tr>
              <tr>
                <td>2001/03/01</td>
                <td>日記をつけはじめました.</td>
              </tr>
              <tr>
                <td>2001/02/01</td>
                <td>ホームページを立ち上げました</td>
              </tr>
            </table>
          </div>
      
          <!-- コンテンツを箇条書きにしてリンクを張る -->
      
          <div class="contents">
            <h2>コンテンツ</h2>
            <ul>
              <li>
                <a href="./diarylist.html">えーさんの日記</a>
                <p>
      私の日記です.印象に残った出来事を書き綴っています.
                </p>
              </li>
              <li>
                <a href="./profile.html">ぷろふぃーる</a>
                <p>
      私の自己紹介です.私について知りたい人は読んで下さい.読んで連絡をとりたくなった人は下記の連絡先までメールをください.
                </p>
              </li>
              <li>
                <a href="./favorite.html">お気に入り</a>
                <p>
      お気に入りのページを紹介します.趣味,友人などに関するリンクです.
                </p>
              </li>
              <li>
                <a href="./albumlist.html">アルバム集</a>
                <p>
      旅行などでとったデジカメ画像を置いています.
                </p>
              </li>
              <li>
                <a href="./partsreview.html">パーツレビュー</a>
                <p>
      私が購入したパソコンパーツのレビューです.独断と偏見に満ちていますので読む人なりの解釈をお願いします.
                </p>
              </li>
            </ul>
          </div>
      
          <hr />
      
          <!-- 連絡先メールアドレス -->
      
          <div class="contact">
            <a href="mailto:aa-san@mail.goo.ne.jp">連絡先</a>
          </div>
      
          <hr />
      
          <!-- フットノート:この部分は全部のファイルで同じようにする -->
      
          <div class="footnote">
            <div class="copyright">
              <p>
      Copyright (C) 1998-2001, えーさん
              </p>
              <p>
      All rights reserved.
              </p>
            </div>
          </div>
        </body>
      </html>

    4. xml 記述

       このページの情報を、xml で記述した例です。<title>、<news>、<content>、<contact> タグから構成されています。この xml 記述は 2行目の xml-stylesheet の変換記述で xml に変換しブラウザで表示できます。IE5.0 以後ではこの記述を受け入れ、表示することが可能です。

      frontpage.xml
      <?xml version="1.0" encoding="Shift_JIS" ?>
      <?xml-stylesheet type="text/xsl" href="../xsl/frontpage.xsl" ?>
      
      <frontpage>
              <title image="../images/title.gif">
                      えーさんのページ
              </title>
      
              <news>
                      <date>2001/03/01</date>
                      <text>
      日記をつけはじめました.
                      </text>
              </news>
      
              <news>
                      <date>2001/02/01</date>
                      <text>
      ホームページを立ち上げました
                      </text>
              </news>
      
              <content>
                      <url>./diarylist.xml</url>
                      <label>えーさんの日記</label>
                      <text>
                              <para>
      私の日記です.印象に残った出来事を書き綴っています.
                              </para>
                      </text>
              </content>
      
              <content>
                      <url>./profile.xml</url>
                      <label>ぷろふぃーる</label>
                      <text>
                              <para>
      私の自己紹介です.私について知りたい人は読んで下さい.読んで連絡をとりたくなった人は下記の連絡先までメールをください.
                              </para>
                      </text>
              </content>
      
              <content>
                      <url>./favorite.xml</url>
                      <label>お気に入り</label>
                      <text>
                              <para>
      お気に入りのページを紹介します.趣味,友人などに関するリンクです.
                              </para>
                      </text>
              </content>
      
              <content>
                      <url>./albumlist.xml</url>
                      <label>アルバム集</label>
                      <text>
                              <para>
      旅行などでとったデジカメ画像を置いています.
                              </para>
                      </text>
              </content>
      
              <content>
                      <url>./partsreview.xml</url>
                      <label>パーツレビュー</label>
                      <text>
                              <para>
      私が購入したパソコンパーツのレビューです.独断と偏見に満ちていますので読む人なりの解釈をお願いします.
                              </para>
                      </text>
              </content>
      
              <contact>
                      <address>aa-san@mail.goo.ne.jp</address>
                      <label>連絡先</label>
              </contact>
      </frontpage>

    5. 変換記述

       xsl は xml のタグ情報を抽出し、xml 記述を生成する「変換記述」を行います。
      <xsl:for-each select="/frontpage/news">
      で、xml の frontpage/news を選択し、
      <xsl:value-of select="date" />
      で、日付情報を抽出しています。
       表形式でなく、リスト形式や <href >によるリンク形式に変更することも可能で、「情報」と「構造」がきれいに分離されています。さらに、色やレイアウトなどの指定は css 記述で分離することができます。

      frontpage.xsl
      <?xml version="1.0" encoding="Shift_JIS" ?>
      
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      
        <!-- 共通部分の読み込み -->
        <xsl:import href="./footnote.xsl" />
      
        <xsl:output method="html"
          encoding="SHIFT_JIS"
          doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
          doctype-system="DTD/xhtml1-strict.dtd" />
      
        <xsl:template match="/">
      
          <html xmlns="http://www.w3.org/1999/xhtml"
                xml:lang="ja" lang="ja">
      
            <head>
              <link rel="stylesheet" href="../css/frontpage.css" type="text/css" />
              <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
              <title>
                <xsl:value-of select="/frontpage/title" />
              </title>
            </head>
      
            <body>
      
              <!-- ページタイトル -->
              <h1>
                <xsl:choose>
                  <xsl:when test="/frontpage/title/@image">
                    <img src="{/frontpage/title/@image}" alt="{/frontpage/title}" />
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of select="/frontpage/title" />
                  </xsl:otherwise>
                </xsl:choose>
              </h1>
      
              <!-- 更新情報 -->
              <div class="news">
                <h2>更新情報</h2>
                <a href="../cgi-bin/update.cgi">詳細はこちら</a>
                <table border="0" cellpadding="3" cellspacing="3">
                  <tr>
                    <th>更新日</th>
                    <th>内容</th>
                  </tr>
                  <xsl:for-each select="/frontpage/news">
                    <xsl:sort select="date" order="descending" />
                    <tr>
                      <td><xsl:value-of select="date" /></td>
                       <td><xsl:value-of select="text" /></td>
                    </tr>
                  </xsl:for-each>
                </table>
              </div>
      
              <!-- コンテンツ -->
              <div class="content">
                <h2>コンテンツ</h2>
                <ul>
                  <xsl:for-each select="/frontpage/content">
                    <li>
                      <a href="{url}">
                        <xsl:value-of select="label" />
                      </a>
                      <xsl:for-each select="text/para">
                        <p>
                          <xsl:value-of select="." />
                        </p>
                      </xsl:for-each>
                    </li>
                  </xsl:for-each>
                </ul>
              </div>
      
              <!-- 連絡先 -->
              <div class="contact">
                <a href="mailto:{/frontpage/contact/address}">
                  <xsl:value-of select="/frontpage/contact/label" />
                </a>
              </div>
      
              <!-- 共通部分(フッタ)の呼び出し -->
              <xsl:call-template name="footnote" />
      
            </body>
          </html>
        </xsl:template>
      
      </xsl:stylesheet>
      

  2. xml 記述によるページ作成


    1. 特徴

      形式が定まったページを作成するには、xml で情報記述、xsl で構造を記述、さらに css でレイアウト(スタイル)記述、が可能で、この方が柔軟性が高く、効果的なページ作成が可能です。

    2. 特殊なxml

       すでの、特定の分野を扱う xml はいくつか提案されそれを処理するシステムが提供されています。だ代表的なものに、グラフィック分野を扱う SVG や数式を扱う MathML などがあります。ただし、どちらも懲りすぎたせいか、「定番」にはなってないような気がします。

    3. 形式が不定なページ

       しかし、形式が不定なページの場合、xml と xsl 双方の変更が必要で非効率です。基本的には、「データベース登録」に適した内容か、そうでないか、で分類できそうです。階層型のキーワードで検索がかけられる場合 xml で記述し、そうでない場合直接 html で記述することになりそうです。

    4. xml型のデータベース

       問題は、xml ガたのデータを データベース として保存し検索できる標準的な(定番の)システムはまだ存在しないようです。ただし、時間の問題だと思われます。