XSLTでHTML5のDOCTYPEを出力する

このページの目次
  1. 概要
  2. DOCTYPE legacy stringを出力する
  3. DOCTYPEを文字列として出力する
  4. XSLT 3.0を使用する
  5. HTML5に対応した処理系を使用する
  6. 参考文献

概要

HTML5では、冒頭に「<!DOCTYPE html>」というDOCTYPEを記述します。これは従来のHTMLやXMLのDOCTYPE宣言とは形式が異なっているため、XSLTで出力するには工夫が必要です。

ここでは、以下の4つの方法を紹介します。

DOCTYPE legacy stringを出力する

HTML5の仕様では、短い形式のDOCTYPE(<!DOCTYPE html>)を出力できない処理系に対しては、代わりに「<!DOCTYPE html SYSTEM "about:legacy-compat">」を出力することが認められています。この文字列は「DOCTYPE legacy string」と呼ばれています(参考: HTML5の仕様書の「8.1.1 The DOCTYPE」)。

DOCTYPE legacy stringを出力するには、以下のようなxsl:output要素を記述します(doctype-public属性は省略し、doctype-system属性の値を"about:legacy-compat"とします)。

<xsl:output
  encoding="utf-8"
  doctype-system="about:legacy-compat"
  method="html"/>

補足: DOCTYPE legacy stringではブラウザが互換モードになるという情報を見かけましたが、Internet Explorer 8, 9, 10, 11の各バージョンで検証した結果、どのバージョンでも標準モード(エッジモード)で表示されることを確認しました。また、Firefox 31でも標準準拠モードで表示されることを確認しました。

DOCTYPEを文字列として出力する

どうしても短い形式のDOCTYPE(<!DOCTYPE html>)を出力したい場合には、ただの文字列としてDOCTYPEを出力する方法もあります。例えば、以下のようにルートノードの冒頭でDOCTYPEの文字列を出力します。

<xsl:template match="/">
  <xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE html>]]></xsl:text>
  <!-- 省略 -->
</xsl:template>

注意: この方法では、変換結果がオブジェクト(例えばDOMツリー)として別の処理系に渡される場合に、出力した文字列がDOCTYPEと見なされない可能性があります。例えば、「<?xml-stylesheet ...?>」を使用して、ブラウザでXMLをHTMLに変換して表示する場合に、ブラウザによってはDOCTYPEが単なる文字列と認識されることがあります。

XSLT 3.0を使用する

XSLT 3.0(執筆時点ではまだ草案)はHTML5に対応しています。以下のように、xsl:output要素のhtml-version属性で「5.0」を指定すると、HTML5形式のDOCTYPEが出力されます(html-version属性はXSLT 3.0で追加された新しい属性です)。

<xsl:output
  encoding="utf-8"
  method="html"
  html-version="5.0"/>

本来であればこの方法が一番良いのですが、現状のXSLT 2.0に対する各処理系の対応状況からすると、XSLT 3.0に対応する処理系もあまり多くはないと考えます。

HTML5に対応した処理系を使用する

SaxonはHTML5の出力に対応しており、XSLT 3.0でなくても、以下のようなxsl:output要素を記述すると「<!DOCTYPE HTML>」を出力します(Saxon-HE 9.5.1.6で確認)。

<xsl:output
  encoding="utf-8"
  method="html"
  version="5"/>

Saxon以外にもHTML5に対応した処理系があるかもしれませんが、調査していません。

参考文献

8 The HTML syntax — HTML5
HTML5の仕様書(2014年7月31日付けの勧告候補)の一部です。DOCTYPEおよびDOCTYPE legacy stringの記述方法について書かれています。
XSL Transformations (XSLT)
XSLT 1.0の仕様書です。xsl:output要素およびxsl:text要素の詳細仕様についてはこのページを参照してください。
XSLT 2.0 and XQuery 1.0 Serialization (Second Edition)
XSLT 2.0のSerializationについての仕様書です。XSLT 2.0ではHTML5のDOCTYPE出力に関する記述がありません。
XSLT and XQuery Serialization 3.0
XSLT 3.0のSerializationについての仕様書です。HTML5のDOCTYPE出力に関する記述があります。
Saxon Documentation(xsl:outputのページ)
XSLTの処理系であるSaxonのドキュメントの一部です。SaxonのHTML5対応に関する記述があります。