-
文献
このプログラムソースは、大田一郎:「XMLツールキット」、SHUWA System からの引用です。
-
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 はタグに「意味付け」が明確になっていれば、正確な階層的情報抽出が可能です。
-
生成する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>
-
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>
-
変換記述
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>