ここ数年、一部界隈でアンチXMLみたいな動きがあったりするが、現実には XML はいろんな場面で使われている。中には数万行のものがあったりするけど、さすがにそのサイズになると、直接、内容を読もうとすると、結構不便だったりする。
というわけで、最近重宝している ブラウザと Javascript と XSLT を使った小技を書いてみる。
こんな感じの XML があるとする。
<?xml version="1.0"?> <numerals> <numeral><arabic>1</arabic><jp>壱</jp><en>one</en></numeral> <numeral><arabic>2</arabic><jp>弐</jp><en>two</en></numeral> <numeral><arabic>3</arabic><jp>参</jp><en>thee</en></numeral> </numerals>
これを XSLT で HTML に変換して、ブラウザ上で左下のようなリストを表示し、それぞれのリスト要素に設定されているハイパーリンクをクリックすると、右下の様に詳細が表示されるといった事をしたい。
| ⇨ |
|
以下、その方法。
====リストを表示する XSLT は以下のようなものになる。ポイントは<a>要素を生成しているところで、javascript 関数 showDetail()に arabic 要素を渡すようなリンクが作られる。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <ul> <xsl:for-each select="numerals/numeral"> <li> <xsl:element name="a"> <xsl:attribute name="href"> javascript:showDetail(<xsl:value-of select="arabic"/>) </xsl:attribute> <xsl:value-of select="jp"/> </xsl:element> </li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet>
で、次に詳細を表示するためのXSLTは以下で、ポイントはパラメータ arabic をグローバルで宣言しているところ。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="arabic"/> <xsl:template match="/numerals/numeral"> <xsl:for-each select=".[arabic=$arabic]"> <table> <tr> <td>数字</td> <td><xsl:value-of select="arabic"/></td> </tr> <tr> <td>日本語</td> <td><xsl:value-of select="jp"/></td> </tr> <tr> <td>英語</td> <td><xsl:value-of select="en"/></td> </tr> </table> </xsl:for-each> </xsl:template> </xsl:stylesheet>
いよいよ、Javascript と それを含むHTMLだけど、ソースは以下のようなものになる。
<html> <head> <script type="text/javascript" src="sarissa.js"></script> <script type="text/javascript"> function loadXmlFile(fileName) { var result = Sarissa.getDomDocument(); result.async = false; result.load(fileName); return result; } function replaceResultArea(xmlDom) { var serializer = new XMLSerializer(); var output = serializer.serializeToString(xmlDom.documentElement); document.getElementById("resultArea").innerHTML = output; } function showList() { var xml = loadXmlFile("test.xml"); var xslt = loadXmlFile("ul.xsl"); var processor = new XSLTProcessor(); processor.importStylesheet(xslt); var xmlDom = processor.transformToDocument(xml); replaceResultArea(xmlDom); } function showDetail(arabic) { var xml = loadXmlFile("test.xml"); var xslt = loadXmlFile("detail.xsl"); var processor = new XSLTProcessor(); processor.importStylesheet(xslt); processor.setParameter("", "arabic", arabic); var xmlDom = processor.transformToDocument(xml); replaceResultArea(xmlDom); } </script> </head> <body onload="showList()"/> <div id="resultArea"/> </body> </html>
以上、「(1)パラメータを与えつつ、(2)動的に XSLT を適用して、(3)ブラウザ上で表示を切り替える」方法。サンプルなんで、簡単なものだけどなんぼでも応用がきく。(例えば、静的ソース解析ツールが吐いたXML形式のレポートを分析したり、XMIで出力したUMLのドキュメントを解析してメトリクスを試算したりとか。)
ちなみに、個人的には XML それ自体に対する忌避感みたいなのは、全くといって良いほど無い。他の大抵の技術要素と同じく、上手く使えば役に立つし、下手に使えば役に立たないという単純な問題。
0 件のコメント:
コメントを投稿