[Java] HTMLページ中でXMLをIE風にツリー表示する。 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

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風に出力されるというわけです。