HTMLページの中でXMLを表示する時にIE風のツリー表示ができれば見やすくて便利です。
IE標準のXML表示は"defaultss.xsl"というXSLTによって変換されたものなので、この"defaultss.xsl"を流用し、JavaでXMLからHTMLへと変換してやればそのようなことも可能になります。
ただ、この"defaultss.xsl"は”IE標準のXML表示に使われているXSLT
”で書いたように、ファイルに保存したり、ソースを表示したりということができないため、使えるXSLTファイルにするためにちょっとした編集作業が必要になります。
そこで...というか実はこの"defaultss.xsl"にたどり着く前に、どこかにXMLをきれいに表示するためのXSLTファイルはないかと、ローカルドライブにあるXSLTファイル(拡張子が".xsl")を片っ端から検索して見たところ、Oracleのインストールディレクトリの下に"xml-pretty-print.xsl"というXSLTファイルを発見しました。
名前からして「XMLをきれいに印刷しますよ~」的な香り漂うファイル名だったので中身を確認するとヘッダーに以下のような文言がありました。
<!-- | | XSLT REC Compliant Version of IE5 Default Stylesheet | | Original version by Jonathan Marsh (jmarsh@microsoft.com) | http://msdn.microsoft.com/xml/samples/defaultss/defaultss.xsl | | Conversion to XSLT 1.0 REC Syntax by Steve Muench (smuench@oracle.com) | +-->
どうやらIE5のdefaultss.xslと同等のXSLTファイルのようです。
内容はXSLT素人には難解で解読する気力もありませんが、ともかくこれを流用してJavaでXMLからHTMLに変換してやれば、XMLをIE風ツリー表示できそうです。
ということで、早速これを組み込んだJavaプログラム(Servlet)を作ってみました。
XMLのみを表示する場合
まず、XMLのみを表示する場合はXSLTファイルをそのまま利用します。
だいぶ端折っていますが、XMLの変換部分は大体以下のようになります。
. . . import java.io.*; import javax.transform.*; import javax.transform.stream.*; . . . PrintWriter out = response.getWriter(); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer( new StreamSource( ctx.getResource( "xml-pretty-print.xsl" ).toString() ) ); transformer.setOutputProperty( "encoding", "Shift-JIS" ); transformer.transform( new StreamSource( new StringReader( xmlDocument ) ), new StreamResult( out ) ); . . .※response:HttpServletResponse
※xmlDocument:String
至ってシンプルです。
XMLをHTMLページの内容の一部として表示する場合
XMLをHTMLの内容の一部として表示する場合は、少し工夫が必要になります。まず、XSLTファイルには<HTML>から書かれているので、これを削除してやらなければなりません。
XSLTファイルの最初のテンプレート( <xsl:template match="/"> )から <xsl:apply-templates/> を残して残りの部分をごっそりと抜き出します。
すると、最初のテンプレートは以下のようになります。
<xsl:template match="/"> <xsl:apply-templates/> </xsl:template>そして、抜き出した内容から <SCRIPT></SCRIPT> で囲まれた内側の部分を"xml-pretty-print.js"というファイルに保存し、<STYLE></STYLE> で囲まれた内側の部分を"xml-pretty-print.css"というファイルに保存します。
要するにXSLTファイルからHTMLの<BODY></BODY>の中以外の部分を取り除き、JavaScriptとCSSを別ファイルに分離するという小細工を施すわけです。
このようにして分割したXSLTファイルとJavaScriptファイルとCSSファイルを使用してXMLをHTMLページの内容の一部として出力するのですが、例えば、見出を1行つけてXMLを表示する場合は以下のようになります。
. . import java.io.*; import javax.transform.*; import javax.transform.stream.*; . . . PrintWriter out = response.getWriter(); out.println( "<html>" ); out.println( "<head>" ); out.println( "<script language=\"JavaScript\" src=\"xml-pretty-print.js\"></script>" ); out.println( "<link rel=\"stylesheet\" type=\"text/css\" href=\"xml-pretty-print_xml.css\">" ); out.println( "</head>" ); out.println( "<BODY>" ); out.println( "<h3>XML表示</h3>" ); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer( new StreamSource( ctx.getResource( "xml-pretty-print.xsl" ).toString() ) ); transformer.setOutputProperty( "encoding", "Shift-JIS" ); transformer.transform( new StreamSource( new StringReader( xmlDocument ) ), new StreamResult( out ) ); out.println( "</BODY>" ); out.println( "</HTML>" ); . . .
XMLの変換を行う部分の前後でXML部分以外のHTMLのタグを出力しています。
ここで<HEAD> の <Script> と <link> でそれぞれJavaScriptファイルとCSSファイルを指定していますが、これによってXMLがIE風に出力されるというわけです。