XSLT により XML ファイルを HTML として表示する際のノウハウ的なもの
Web サービスや Web アプリケーションなどでは、データを XML でやりとりすることも多いと思います。 XML ファイルをブラウザで表示するようなこともあるかもしれません。 そういうとき、XML ファイルのテキストデータがそのまま表示されるよりも、HTML 形式で表示された方が見やすいわけで、そのために使用するのが XSLT というものです。
XSLT とは、XSL (Extensible Stylesheet Language) による変換 (Transform) のことです。 XSL は XML に適用するスタイルシートの一種で、XSLT により XML 構造を別の XML 構造に変換したり、HTML や単なるテキストデータに変換する事ができます。
XSLT によって XML を HTML に変換するための方法については各種サイトにて解説がありますので、ここでは注意点を書いておきます。
名前空間の扱い
XSL ファイルの中では、XSL 適用先 XML の各要素を XPath により選択します。
XSL 適用先の XML で名前空間 URI が使われていないならば名前空間について特に気にする必要はありませんが、XSL 適用先 XML で名前空間 URI が使われているならば名前空間にも気をくばる必要があります。
どのように名前空間を指定するかという方法は簡単で、XSL 側で名前空間接頭辞 (prefix) を宣言し、XPath でもその prefix を使えば良いです。
例えば、以下のようになります。
<!-- 適用先 XML -->
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<test-data xmlns="http://www.vividcode.info/test">
<!-- test-data 要素の名前空間 URI は Dttp://www.vividcode.info/test -->
</test-data>
<!-- XSL ファイル -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://www.vividcode.info/test">
<!-- prefix p を名前空間 URI http://www.vividcode.info/test と結びつける -->
...
<!-- 上で宣言したので XPath の中で prefix p を使用できる -->
<xsl:apply-templates select="/p:test-data">
...
DOCTYPE 宣言
XSL のルート要素において、出力後の HTML の DOCTYPE のシステム識別子と公開識別子を指定することができます。 これらを指定しないと IE (ver. 6 から 8 で確認) においてレンダリングモードが過去互換モードになってしまいますので、指定してやる必要があります。
以下、例 *1。
<!-- XSL ファイル -->
...
<xsl:output method="html" media-type="text/html" encoding="utf-8"
doctype-public="//W3C//DTD HTML 4.0 Transitional//EN"
doctype-system="http://www.w3.org/TR/REC-html40/loose.dtd" />
...
IE のための条件付コメントを出力する方法
IE は、ある特殊な形式で書かれたコメントを条件付コメントとして認識します。 例えば、以下のような形式のコメントです。
<!-- HTML ファイル -->
...
<!--[if IE 6.0]>IE 6 はここに書かれている内容をコメントとして扱わず、
通常通り書かれているとみなす<![endif]-->
このような条件付コメントを XSL でも出力することができます。 方法としては単純で、単にコメント要素を XSL で生成し、そのコメント要素の中身を条件付コメントの形式で書くだけです。 注意点としては、コメント内に "<" という文字を書く必要があるため、それを "<" として書くか、全体を CDATA セクションにしなければならない、ということです。 以下の例では全体を CDATA セクションにしています 。
<!-- XSL ファイル ((コードにミスがあったため修正しました。 (2010-02-28 18:08 JST) )) -->
...
<xsl:comment><![CDATA[[if IE 6]>IE 6 はここに書かれている内容をコメントとして扱わず、
通常通り書かれているとみなす<![endif]]]></xsl:comment>
...