XMLとXSLTについて 1.はじめに インターネットの 急 速 な 発 展 に 伴 い コンピ ュータを 介 して 組 織 や 個 人 を 結 びつけるよう になってきました これらの 情 報 は 主 に HTML 形 式 の 情 報 です しかし HTML 形 式 の 情 報 では 複 雑 なデー タ 構 造 が 記 述 できないなどといった 表 現 力 に 限 界 があります そこで 注 目 されたのが XML 形 式 の 情 報 です ここでは XML の 特 徴 及 びその 利 用 方 法 等 に ついて 紹 介 します 2.XML について 2-1 XML(eXtensible Markup Language) HTML のようなシンプルなフォーマット で 文 章 構 造 を 記 述 でき 独 自 にタグを 定 義 する ことができるマークアップ 言 語 です 2-2 XML の 特 徴 文 章 のデータに 意 味 づけが 出 来 る XMLでは データ 開 始 タグと 終 了 タグで 括 って 記 述 することで 各 データに 意 味 付 け を 行 います 記 述 規 則 が 比 較 的 簡 単 レイアウト 用 の 定 義 は 含 まない XML 文 書 には データをどうするか? というような 見 た 目 のデザインを 記 述 する ものは 含 まれません XML 文 書 をどう 表 示 するかはCSSやXML 専 用 のスタイルシ ートであるXSL 側 で 記 述 します プラットフォーム 独 立 XMLはテキストベースなので 特 定 のバ イナリフォーマットのデータ 形 式 と 比 較 す ると 異 なる 機 種 異 なるプラットフォーム 間 でのやりとりを 比 較 的 簡 単 に 行 うことが 出 来 ます 総 合 情 報 基 盤 センター 技 術 専 門 職 員 畑 hata@cns.toyama-u.ac.jp 2-3 利 用 分 野 Webサービス 例 えば ある 条 件 にあった 物 をネットワー クで 検 索 した 場 合 今 までは 利 用 者 自 身 が 各 サイトに 個 別 アクセスして 検 索 しましたが Webサービスが 提 供 されれば 各 サイトに アクセスした 結 果 をまとめ 利 用 者 の 条 件 に あった 物 を 探 しだすというサイトを 従 来 より も 簡 単 に 構 築 することができます EC(Electoric Commerce) ECとはインターネットなどのネットワー クを 介 した 電 子 商 取 引 のことです この 電 子 商 取 引 では 企 業 間 の 流 通 するデー タの 変 換 フォーマットとしてXMLが 利 用 さ れています また Webベースの 受 発 注 シ ステムはコンテンツ 配 布 とともに サーバサ イドのアプリケーションの 構 築 にもXMLが かかわっています 定 義 ファイル 定 義 ファイルとはアプリケーションが 動 作 する 条 件 を 記 述 したファイルです このフ ァイルの 内 容 を 書 き 換 えることによって ア プリケーション 自 身 を 変 更 することなく ア プリケーションの 実 行 内 容 を 変 更 することが 出 来 ます 定 義 ファイルとしてのXMLの 利 点 は 下 記 のとおりです 1) タグに 意 味 づけができるので 人 が 見 てわかりやすい 2) 定 義 ファイルを 読 み 込 んで 構 文 を 解 釈 するパーサを 作 成 する 必 要 がない 3) 複 雑 なデータ 構 造 を 記 述 できる 篤 - 102-
3.XML の 記 述 3-1 XML の 記 述 の 決 まり 1 XML 文 章 であることを 宣 言 する 2 文 字 コードを 指 定 する 3 すべての 要 素 には 終 了 タグを 書 く 4 すべての 要 素 は 正 しく 入 れ 子 にする 5 XML 文 章 には 1 つのルート 要 素 を 書 く 6 指 定 した 文 字 コードで 保 存 する 7 大 文 字 小 文 字 を 区 別 する 8 属 性 値 は 二 重 引 用 符 で 挟 む タグの 記 述 例 ( 開 始 タブ) タブ ( 終 了 タブ) 要 素 <title>xmlの 記 述 </title> 内 容 入 れ 子 構 造 の 例 要 素 名 < 要 素 a> < 要 素 b> < 要 素 c> </ 要 素 c> </ 要 素 b> < 要 素 d> </ 要 素 d> < 要 素 a> 要 素 c 要 素 b 要 素 d 要 素 a 3-2 XML の 記 述 例 <?xml version="1.0" encoding="shift_jis"?> <data> <code>9300221</code> <addres> 中 新 川 郡 立 山 町 前 沢 2440</addres> </mail> <code>9300282</code> <addres> 中 新 川 郡 舟 橋 村 仏 生 寺 55</addres> </mail> <code>9300353</code> <addres> 中 新 川 郡 上 市 町 法 音 寺 1</addres> </mail> <code>9301312</code> <addres> 上 新 川 郡 大 山 町 上 滝 523</addres> </mail> <code>9302105</code> <addres> 婦 負 郡 山 田 村 湯 780</addres> </mail> <code>9320057</code> <addres> 小 矢 部 市 本 町 1-1</addres> </data> - 103-
3-3 XML の Web 表 示 記 述 した XML を Web ページで 表 示 すると 図 1のように 表 示 されます 図 2 Excel2002 での XML 文 書 の 読 み 込 み 図 1 XMLの Web での 表 示 図 1のように XML だけでは Web で 表 示 し た 際 には XML で 記 述 したとおりにしか 表 示 さ れません レイアウト 表 示 する 場 合 は XSL と CSS を 使 って 表 示 させます また Microsoft Excel2002 以 降 では XML 形 式 データを 読 み 込 むこともできます Microsoft Excel2002 を 使 っ て XML 文 書 を 読 み 込 むと 図 2のように 各 列 の 項 目 毎 にデータが 読 み 込 めます 4.XSL を 使 って Web ページの 表 示 の 仕 方 XSL(eXtensible Stylesheet Language)は XML 文 書 からのデータを 取 り 出 し,レイアウ ト 処 理 を 行 います XSL を 使 って Web ページを 表 示 する 場 合 XML 文 書 と XSL を 関 連 付 ける 必 要 があります XML の 内 容 文 を 記 述 する 前 に <?xml-stylesheet type= text/xsl href= 使 用 する XSL のファイル 名?> を 追 加 します XSL の 記 述 内 容 例 については sample.xsl リストを 用 いて 紹 介 します 4-1 sample.htm ソース <?xml version="1.0" encoding="shift_jis"?> 1 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/tran sform" version="1.0"> 2 <xsl:template match="/"> 3-104-
<html lang="ja"> <head> <title>sample</title> <style type="text/css"> table{border:solid 1pt black;} th{border:solid 1pt black;padding:10;} td{border:solid 1pt black;padding:10;} </style> </head> <body> <div> <xsl:apply-templates select="data" /> 4 </div> </body> </html> </xsl:template> <xsl:template match="data"> 5 <table> <tr><th> 郵 便 番 号 </th><th> 市 町 </th></tr> <xsl:for-each select="mail"> 6 <tr><td><xsl:value-of select="code"/> </td> <td><xsl:value-of select="addres" /> </td></tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> 8 7 テンプレートルール XML 文 書 をどのように 変 換 させるかとい った 処 理 内 容 4 次 に 処 理 する 要 素 の 指 定 ( data 要 素 を 指 定 ) 5 要 素 名 が data であるときのテンプレー トルールの 定 義 ( 処 理 ) 6 select 属 性 で 指 定 した 式 で 選 択 した 要 素 名 がある 間 繰 り 返 し 処 理 を 行 う( mail 要 素 名 がある 間 処 理 を 繰 り 返 す) 7 要 素 名 が code のとき code の 要 素 内 容 を 取 り 出 す 8 要 素 名 が"addres"のとき"addres"の 要 素 内 容 を 取 り 出 す 4-2 sample.xsl ソースの 説 明 1 XML 文 章 の 宣 言 と 文 字 コードの 指 定 2 XSL のルート 要 素 と 名 前 空 間 の 明 記 1,2は XSL ファイルを 記 述 するための 決 まりごと 3 ルートノード(/)にマッチしたときのテンプ レートルールの 定 義 図 3 XSL を 利 用 しての Web 表 示 - 105-
5.XML と XSLT を 使 ってのデータ 処 理 5-1 XSLT(XSL Transformations) 任 意 の XML 文 書 を 読 み 込 んで それを 加 工 して 出 力 することができます 出 力 方 法 は XML 文 書 とは 限 らず プレーンテキストや HTML を 出 力 することができます ここでは XML と XSLT を 使 ってのデータ 処 理 例 として 郵 便 番 号 から 市 町 村 役 所 住 所 の 抽 出 または 市 町 村 役 所 住 所 から 郵 便 番 号 を 抽 出 する 例 を 使 って 紹 介 します mail.htm を 実 行 すると mail.xml が mail.xsl で 変 換 されて 表 示 されます HTML mail.htm XML XSL mail.xml mail.xsl 変 換 結 果 以 下 に mail.htm と mail.xsl ソースを 紹 介 し ます 5-2 mail.htm ソース <html lang="ja"> <head> <title> 郵 便 番 号 検 索 </title> <script type="text/vbscript"> <!-- option explicit dim useriddata,luser,n,itemdata dim stylesheet,filevalue dim variablenode,xmldoc,htmldata,chikan n = 1 sub rclick(n) if n =1 then itemdata="1" else itemdata="2" end sub 1 sub useridgo() useriddata=myform.setuser.value if len(useriddata)<=0 then msgbox " 郵 便 番 号 または 市 町 村 名 を 入 力 してください" myform.setuser.value="" exit sub else set stylesheet=createobject("msxml2.domdocument") 2 3-106-
stylesheet.async=false filevalue=stylesheet.load("mail.xsl") 3 if filevalue=true then set variablenode=stylesheet.selectnodes("//xsl:variable") variablenode(0).text=useriddata luser=len(useriddata) 4 variablenode(1).text=luser variablenode(2).text=itemdata set xmldoc=createobject("msxml2.domdocument") xmldoc.async=false xmldoc.load("mail.xml") 5 htmldata=xmldoc.transformnode(stylesheet) 6 chikan=replace(htmldata,"utf-16","shift_jis") htmldata=chikan document.write(htmldata) else exit sub end if end if end sub --> </script> <style type="text/css"> <!-- body{font-family:"ms Pゴシック",sans-serif;font-size:11pt;line-height:16pt;} h1{font-family:"ms Pゴシック",sans-serif;font-size:18pt;font-weight:bold;line-height:20pt;} h2{font-family:"ms Pゴシック ",sans-serif;font-size:14pt;font-weight:bold;line-height:18pt;color:dimgray;} label{font-family:ms Pゴシック;font-size:11pt;font-weight:bold;} input{font-family:ms Pゴシック; font-size:13pt;ime-mode:inactive;font-weight:bold;text-align:center;} button{font-family:ms Pゴシック;font-size:13pt;width:100px;} --> </style> </head> <body> - 107-
<h1> 郵 便 番 号 検 索 </h1> <div> <input type="radio" name="item" onclick="rclick(1)" checked> 郵 便 番 号 検 索 <input type="radio" name="item" onclick="rclick(2)"> 市 町 村 検 索 <form name="myform"> <p> <label> 検 索 :</label><input type="text" size="10" name="setuser"> <button onclick="useridgo()"> 検 索 実 行 </button> </form> </div> </body> </html> 5-3 mail.htm ソースの 説 明 1 郵 便 番 号 から 所 在 地 検 索 する 場 合 は itemdata に1, 所 在 地 からの 郵 便 番 号 を 検 索 する 場 合 は itemdata に2を 格 納 2 入 力 ボックスにデータが 未 入 力 であれば メッセージを 表 示 3 DOM オブジェクトを 生 成 し load メソッ ドを 使 って XSL ファイル(mail.xsl)の 読 み 込 み 4 DOM の selectnode メソッドを 使 って XSL ファイル 中 の xsl:variable 要 素 の 内 容 を 変 数 variablenod に 格 納 ( 検 索 内 容, 入 力 し た 文 字 数, 検 索 条 件 を variablenod に 格 納 ) 5 Load メソッドを 使 って XML ファイル (mail.xml)を 読 み 込 む 6 XML ファイルを XSL ファイルで 変 換 した 結 果 を 表 示 DOM(Document Object Model) DOM は 文 書 へのアクセス 方 法 を 定 義 する もので ノードを 作 成 したり ノードアクセ スして 内 容 を 抽 出 することを 可 能 にする 5-4 XSL ソース <?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="html" version="4.01" encoding="shift_jis" indent="yes" /> <xsl:variable name="code">test</xsl:variable> <xsl:variable name="lcode">0</xsl:variable> <xsl:variable name="item">0</xsl:variable> <xsl:variable name="chk">2</xsl:variable> <xsl:template match="/"> 1-108-
<html lang="ja"> <head> <title> 郵 便 番 号 <xsl:value-of select="$code" />を 検 索 する</title> <style type="text/css"> table{border:solid 1pt black;} th{border:solid 1pt black;padding:10;} td{border:solid 1pt black;padding:10;} </style> </head> <body> <div> <h1> 郵 便 番 号 検 索 </h1> <h2><xsl:value-of select="$code" />を 検 索 します</h2> <xsl:apply-templates select="data" /> <h6></h6> <a href="mail.htm"> 戻 る</a> </div> </body> </html> </xsl:template> <xsl:template match="data"> <xsl:choose> 2 <xsl:when test ="$Item=$CHK"> <xsl:variable name="codecount" select="count(mail[substring(addres,1,$lcode) =$CODE])" /> 3 <h3><xsl:value-of select="$code" />に 該 当 する 郵 便 番 号 は <xsl:value-of select="$codecount" /> 件 です </h3> <table> <tr><th> 郵 便 番 号 </th><th> 市 町 村 名 </th></tr> <xsl:for-each select="mail"> <xsl:if test="substring(addres,1,$lcode)= $CODE"> <tr><td><xsl:value-of select="code" /></td> 4 <td><xsl:value-of select="addres" /></td></tr> </xsl:if> </xsl:for-each> </table> </xsl:when> - 109-
<xsl:otherwise> 2 <xsl:variablename="codecount" select="count(mail[substring(code,1,$lcode)= $CODE])" /> 3 <h3><xsl:value-of select="$code"/>に 該 当 する 市 町 村 は <xsl:value-of select="$codecount" /> 件 です </h3> <table> <tr><th> 郵 便 番 号 </th><th> 市 町 村 名 </th></tr> <xsl:for-each select="mail"> <xsl:if test="substring(code,1,$lcode)= $CODE"> <tr><td><xsl:value-of select="code" /></td> 4 <td><xsl:value-of select="addres" /></td></tr> </xsl:if> </xsl:for-each> </table> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 5-5 mail.xsl ソースの 説 明 1 XSLT の xsl:variable 要 素 を 使 って 変 数 CODE,LCode,Item,CHK を 宣 言 し CHK 以 外 の 変 数 に 仮 の 値 を 格 納 2 Item が 2 の 場 合 所 在 地 での 検 索 処 理, 1 の 場 合 郵 便 番 号 での 検 索 処 理 3 xsl:variable 要 素 で 変 数 codecount を 宣 言 select 属 性 で 一 致 した 要 素 の 数 を codecount に 代 入 4 addres 要 素 または code 要 素 で 前 方 から 入 力 した 文 字 数 分 が 一 致 した 場 合 一 致 した 項 目 内 用 を 表 形 式 で 表 示 図 4 mail.htm の 表 示 画 面 - 110-
図 5 郵 便 番 号 での 所 在 地 検 索 図 7 所 在 地 での 郵 便 番 号 検 索 図 6 郵 便 番 号 で 所 在 地 の 検 索 表 示 例 図 8 所 在 地 での 郵 便 番 号 検 索 表 示 例 6.おわりに 以 上 のように XML はプラットフォームに 関 係 なくデータのやり 取 りができます それゆえに Web クライアントを 利 用 し 複 数 の 異 なるデー タベースの 情 報 を 組 み 合 わせることができます また XSL や XSLT を 利 用 することで 各 々の 利 用 者 に 応 じて 異 なるビューで 表 示 することや 利 用 者 のニーズに 応 じた 情 報 検 索 ならびに 情 報 をフィルタリングすることもできます 参 考 図 書 XML+XSLT 実 用 スーパーサンプル 集 CQ 出 版 社 Windows で 学 ぶ XML 技 術 評 論 社 - 111-