この文書「Polyglot マークアップ: HTML 互換の XHTML 文書」は、W3C の HTML Working Group による「Polyglot Markup: HTML-Compatible XHTML Documents (W3C Working Draft 24 June 2010)」の日本語訳です。
この日本語訳は参考情報であり、正式な文書ではないことにご注意ください。また、翻訳において生じた誤りが含まれる可能性があります。
原文の最新版 は、この日本語訳が参照した版から更新されている可能性があります。また、この日本語訳自身も更新されている可能性があります。日本語訳の最新版は、http://standards.mitsue.co.jp/resources/w3c/TR/html-polyglot/ から参照することができます。古いものについても、Web 標準仕様 日本語訳一覧 から参照することができます。
Copyright © 2010 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
Polyglot マークアップを利用する文書は、HTML5 文書であると同時に XML 文書でもあり、さらに HTML 文書でもある。また文書がそうなるにあたり、よく定義された制約が課されていることも表す。制約を満たす polyglot マークアップは処理系が HTML か XHTML であるかに関係なく HTML5 仕様に互換であると解釈される。Polyglot マークアップは特定の DOCTYPE, 名前空間宣言、そして特定の表記を利用する。要素と属性は多くの場合小文字で記すが、まれに camel case で記述することがある。Polyglot マークアップでは特定の属性において、値を小文字で記述する。制約は、空要素、名前実体参照、スクリプトとスタイルシートの利用にも及ぶ。
このセクションは、この文書が公開された時点における状況を記す。他の文書がこの文書を上書きすることがある。W3C より公開される技術文書と、この文書の最新版は W3C 技術文書インデックス (http://www.w3.org/TR/) にて見ることができる。
この文書は、XHTML 文書もしくは HTML 文書を、HTML5 準拠な HTML パーサでも XML パーサでも妥当なものにしたいと考える製作者のために、その指針を要約したものになる。この仕様は Web 製作者による利用を想定している。ユーザーエージェントのための仕様ではないことから、それらに対して制約を設けることはない。この文書では HTML5 準拠なユーザーエージェントがどのように HTML 文書を処理するかについて定義しないことに注意されたい。また、この文書はインターネットメディア型 text/html を定義するものでもない。ユーザーエージェントのための仕様や定義については、[HTML5] および [RFC2854] を参照されたい。
この文書は W3C HTML WG より First Public Working Draft として公開された。この文書は W3C 勧告 (Recommendation) となることを目指している。この文書に関するコメントは、public-html@w3.org (購読, アーカイブ) まで寄せられたい。いかなるフィードバックも歓迎する。
草案 (Working Draft) としての公開は、W3C メンバーからの支持を得たことを意味しない。この文書は更新や差し替え、他の文書により廃止される可能性のある策定途中の文書となる。策定中という旨を明記せず、この文書を参照することは適切ではない。
この文書は 5 February 2004 W3C Patent Policy のもと運営されるグループにより作成された。この文書は参考情報である。 W3C は 特許情報の開示に関する公開リスト を関連する団体と共にその成果物とあわせて管理している。リストには情報開示に関する説明もあることから、そちらについても参照されたい。特許について十分に知識のある人物が当該仕様に関し Essential Claim(s) が認められると判断した場合、W3C Patent Policy の 第 6 章 に従い情報を開示しなければならない。
このセクションは非規範的である。
HTML5 文書が妥当な XML 文書としても提供されることは価値がある。たとえば、製作者が XML ツールを利用し文書を生成し、また他者が XML ツールを用いてその文書を処理することを考えよう。これらの文書は text/html で提供される。この文書では、HTML パーサと XML パーサのどちらでも構文解析可能な文書を作成することを polyglot マークアップ と呼ぶ。Polyglot マークアップは作成した文書が HTML5 文書と XML 文書というふたつを満たすように、双方の言語仕様のうち重なる部分を記すものである。
Polyglot マークアップは処理命令 (processing instructions) を利用しない。ただし、XML 宣言の構文解析規則は処理命令ではなく、Prolog and Document Type Declaration にて別に定義されていることに注意されたい。
Polyglot マークアップは UTF-8 もしくは UTF-16 を利用する。UTF-8 が望ましい。Polyglot マークアップで UTF-16 を利用するとき、エンコーディングには BOM を含め、UTF-16LE または UTF-16BE であることを示すべきである (should)。加えて、この場合 polyglot マークアップは meta charset 宣言を含める必要はない。なぜならパーサは定義により、UTF-16 を読む必要があるからである。
正しい文字エンコーディングのため、polyglot マークアップは次の条件を満たさなければならない (must)。
meta
要素のどちらをも記述し、適切な文字エンコーディングを指定する。Polyglot マークアップが UTF-8 や UTF-16 以外のエンコーディングを利用する場合、文書は XML 宣言を含めなければならない (must)。ただし、この場合文書は文字集合を指定する meta
要素も含まなければならない (must)。Polyglot マークアップが XML 宣言と meta
要素の両方を含むとき、それらは同じ文字エンコーディングを指定する必要がある (must)。
Polyglot マークアップは <!DOCTYPE html>
という DOCTYPE を利用する。ここで、文字列 html
は小文字で記述しなければならない (must) ことに注意されたい。純粋な HTML 文書では、この文字列は大文字小文字を問わないものとして定義されている。 [HTML5]
Polyglot マークアップにおける名前空間の利用にあたり、次の規則が適用される。
<html>
要素は名前空間宣言 xmlns="http://www.w3.org/1999/xhtml"
を利用する。<math>
要素は名前空間宣言 xmlns="http://www.w3.org/1998/Math/MathML"
を利用する。<svg>
要素は名前空間宣言 xmlns="http://www.w3.org/2000/svg"
を利用する。xmlns:xlink="http://www.w3.org/1999/xlink"
とし、xlink:href を利用する前に現れるものとする。接頭辞は次のどちらかにより定義できる。
<html>
要素にて定義。<svg>
要素それぞれに定義。Polyglot マークアップを利用する文書は html
要素を持たなければならない (must)。また、その html
は head
要素と body
要素を持たなければならない (must)。そして、head
は title
要素を持たなければならない (must)。
Polyglot マークアップでは、tr
を囲む tbody
要素を table
要素内に明示的に持たなければならない。これは、HTML パーサは tbody
要素を挿入するが、XML パーサはその処理を行わないため、異なる DOM が生成されることによる。
正しい例:
<table> <tbody> <tr>...
正しくない例:
<table> <tr>...
次に記すガイドラインは、要素名、属性名、属性値のマークアップや、スクリプト、CSS に適用される。必須である場合、polyglot マークアップは ASCII 文字をすべて小文字で記述する。しかし、ギリシャ文字、キリル文字、その他の ASCII でないラテン文字をはじめ、ASCII ではない文字には適用されない。
Polyglot マークアップでは要素名の表記において、大文字と小文字を使い分ける。
altGlyph
altGlyphDef
altGlyphItem
animateColor
animateMotion
animateTransform
clipPath
feBlend
feColorMatrix
feComponentTransfer
feComposite
feConvolveMatrix
feDiffuseLighting
feDisplacementMap
feDistantLight
feFlood
feFuncA
feFuncB
feFuncG
feFuncR
feGaussianBlur
feImage
feMerge
feMergeNode
feMorphology
feOffset
fePointLight
feSpecularLighting
feSpotLight
feTile
feTurbulence
foreignObject
glyphRef
linearGradient
radialGradient
textPath
Polyglot マークアップでは属性名の表記において、大文字と小文字を使い分ける。
definitionurl
属性は definitionURL
と記述しなければならない (must)。
attributeName
attributeType
baseFrequency
baseProfile
calcMode
clipPathUnits
contentScriptType
contentStyleType
diffuseConstant
edgeMode
externalResourcesRequired
filterRes
filterUnits
glyphRef
gradientTransform
gradientUnits
kernelMatrix
kernelUnitLength
keyPoints
keySplines
keyTimes
lengthAdjust
limitingConeAngle
markerHeight
markerUnits
markerWidth
maskContentUnits
maskUnits
numOctaves
pathLength
patternContentUnits
patternTransform
patternUnits
pointsAtX
pointsAtY
pointsAtZ
preserveAlpha
preserveAspectRatio
primitiveUnits
refX
refY
repeatCount
repeatDur
requiredExtensions
requiredFeatures
specularConstant
specularExponent
spreadMethod
startOffset
stdDeviation
stitchTiles
surfaceScale
systemLanguage
tableValues
targetX
targetY
textLength
viewBox
viewTarget
xChannelSelector
yChannelSelector
zoomAndPan
Polyglot マークアップでは、HTML 要素に次のリストで示された属性が存在する場合、その値を小文字で記述する。より詳しくは、必須とされた場合、polyglot マークアップでは、属性値中のすべての ASCII 文字を小文字で表記しなければならない (must)。しかし、ギリシャ文字、キリル文字、その他の ASCII でないラテン文字をはじめ、ASCII ではない文字には適用されない。次のリストにない属性が HTML 要素中にある場合、その値は大文字と小文字を混在させることができる (may)。HTML 以外の要素に与えられた属性の値には、大文字と小文字を混在させることができる。
accept
accept-charset
align
alink
axis
bgcolor
charset
checked
clear
codetype
color
compact
declare
defer
dir
direction
disabled
enctype
face
frame
hreflang
http-equiv
lang
language
link
media
method
multiple
nohref
noresize
noshade
nowrap
readonly
rel
rev
rules
scope
scrolling
selected
shape
target
text
type
valign
valuetype
vlink
Polyglot マークアップでは、次に挙げる要素を空要素としてのみ用いる。
area
base
br
col
command
embed
hr
img
input
keygen
link
meta
param
source
Polyglot マークアップでは、空要素を最小タグ構文で表記する。すなわち、<br/>
といったものになる。XML で許可される <br></br>
は既存のユーザーエージェントにおいて不確かな結果を返す。
訳注: HTML5 の HTML 構文では、<br></br>
がふたつの br
要素として解釈されます。
内容モデルが EMPTY ではない要素について、何も内容を持たないインスタンスがある場合 (例: 空のタイトルや空の段落)、polyglot markup は最小タグ構文を用いない (つまり <p />
ではなく <p></p>
と記述する)。
MathML 要素や SVG 要素については、空要素についても最小タグ構文と、開始タグ終了タグによる表記を行えることに注意されたい。
Polyglot マークアップでは属性値に改行や複数の連続する空白文字を含まない。これらはユーザーエージェントにより処理が異なる。
Polyglot マークアップでは、すべての値を引用符で括る。引用符はシングルクオートもしくはダブルクオートで囲むことができる (may)。
属性値の項も参照されたい。
Polyglot マークアップでは、次に挙げる名前付き実体参照のみを利用する。
amp
lt
gt
apos
quot
このリストに掲載されていない実体について、polyglot 文書は文字参照を利用する。たとえば、polyglot マークアップでは
の代わりに  
を利用する。
スクリプトとスタイルシートの命令は、インラインで埋め込むのではなく、外部ファイルにリンクすべきである (should)。しかし、polyglot マークアップでは、xml-stylesheet 処理命令で外部スタイルシートをリンクすることはできない (must not)。処理命令と XML 宣言 も参照されたい。
次の例は、外部スクリプトと外部スタイルシートを読み込む適切な表記である。
<script src="external.js"></script>
<link rel="stylesheet" href="external.css"/>
document.write()
と document.writeln()
は HTML 文書では妥当であるが、これらの関数は XHTML では利用できない。このため、polyglot マークアップでこれらの関数は使用しない。代わりに、innerHTML
を使用することになる。このとき、innerHTML
プロパティは文字列をとることに注意されたい。XHTML において、XML パーサは文字列を XML として構文解析する。HTML において、HTML パーサは文字列を HTML として構文解析する。この構文解析処理の違いのため、polyglot マークアップに沿わない内容をパーサに送った場合、XML パーサと HTML パーサの間で、結果として生成される DOM に違いが現れる。
Polyglot マークアップでは、スクリプトやスタイルシートが <
や &
, ]]>
, --
を使用する場合、それらを外部リソースとして参照する。ここで、XML パーサはコメントの内容を削除することが許可されているため、これまで利用されてきたスクリプトやスタイルシートの内容をコメント中に記述し、後方互換を保つという手法は XML ベースのユーザーエージェントでは動作しない可能性があることに注意されたい。
Polyglot マークアップで、ソースコード中にクリプトやスタイルシートを記述しなければならない場合、安全な内容 (safe content) もしくは命令を CDATA セクションで囲む必要がある。しかし、polyglot マークアップでは、インラインで記述する内容が外部内容 (foreign content) 内で利用されない限りは、CDATA
セクションを使用しない。
安全な内容 (safe content) とは、<
と &
を含まない内容である。次の例は <script>
内に問題を引き起こす可能性のある文字を含まないため、安全と言える。
<script>document.body.appendChild(document.createElement("div"));</script>
CDATA セクション内にインラインで命令を記述した場合、XHTML と HTML では同じ DOM を得られないことに注意されたい。しかし、これはコードが <script>
要素や <style>
要素内にあるテキストノードの数に依存するものでない限りほとんど問題とはならない。次の例は CDATA
セクションで括られた、インラインスクリプトもしくはインラインスタイルシートの命令を示すものである。
<script> //<![CDATA[ (script goes here) //]]> </script>
<style> /*<![CDATA[*/ (styles go here) /*]]>*/ </style>
MathML や SVG を利用する場合、パーサは XML の構文解析規則に従う。Polyglot マークアップは MathML や SVG を利用する場合、DOM から CDATA インスタンスを得る事に頼らない。これは HTML パーサが DOM 内に CDATA インスタンスを生成しないことにある。
Many thanks to Daniel Glazman, Tony Ross, Sam Ruby, Jonas Sicking, Henri Sivonen, and Philip Taylor. Special thanks to the W3C TAG.
No informative references.