Copyright © 2015 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and document use rules apply.
ポリグロット・マークアップを使用する文書は、HTMLとしてまたはXMLとして処理されるいずれかの場合に、(導入で注釈されるようないくつかの例外をともなう)同一の文書ツリーに解析されるバイトストリームとなる文書である。定義された制約セットを満たすポリグロットマークアップは、HTML5の仕様を通して、HTMLとしてまたはXHTMLとして処理されるかどうかにかかわらず、互換性があると解釈される。ポリグロット・マークアップは、特定のDOCTYPE、名前空間宣言、および特定の活字ケース―通常は小文字だが、時折キャメルケース(先頭文字を大文字)―を要素名や属性名に用いる。ポリグロット・マークアップは、特定の属性値に小文字を使用する。さらに、空要素、名前実体参照、およびスクリプトとスタイルの使用に関する制約を含む。
この節は、公開時点におけるこの文書のステータスについて説明する。他の文書がこの文書に取って代わるかもしれない。W3Cが現在公開しているリストとテクニカルレポートの最新版は、W3C technical reports index at http://www.w3.org/TR/で見つけることができる。
注意。この仕様は、もはやアクティブなメンテナンスになく、HTMLワーキンググループは、さらに維持するつもりはない。
この仕様は、著者のXHTMLまたはHTML文書が、HTMLとして解析されようとXMLとして解析されようと適合することを望む著者のための設計ガイドラインを集約するものである。この文書は、特に、著者が利用可能なXMLまたはHTMLパーサを持つかどうかに関わらず受信者にサービスを提供したいという、ウェブ著者にとって有用であることを意図する。このような懸念は、たとえば、コンテンツシンジケーションで、すなわち受信者がレガシーシステム上にある場合に発生するかもしれない。HTMLポリグロットは、XML 1.xからHTML5への移行を含む、XHTMLへおよびXHTMLからの移行を容易にし、そしてこの文書では、そのような文書に対するUTF-8ベースのプロファイルの要件を正確に指定する。
勧告はこの文書でまたは、ポリグロット・コンテンツを公開するかどうかを注視するW3Cによって作成されない。一般に著者は、HTML5構文とメディアタイプ(HTML構文とtext/html
、またはXHTML構文とapplication/xhtml+xml
のいずれか)を使用してHTMLコンテンツを公開することが勧められる。
この文書は、ユーザーエージェントのための仕様でなく、ユーザーエージェントに義務を作成しない。この文書は、HTML5適合ユーザーエージェントがHTML文書を処理すべき方法を定義しないことに注意する。また、インターネットメディアタイプtext/html
の意味も定義しない。これらの定義に対するユーザーエージェントの手引きについては、[HTML5]および[RFC2854]を参照のこと。
HTML WGに当てられる生成物およびHTML/XHTML互換オーサリングガイド(エディタ:Eliot Graff)に当てられる構成物とともに、W3C公開バグデータベース(http://www.w3.org/Bugs/Public/)を使用して、この文書のバグを提出されたい。バグデータベースにアクセスできない場合、以下に記載するメーリングリストに電子メールでコメントを提出できる。
この文書はWorking Group NoteとしてHTMLワーキンググループ によって発行された。この文書に関するコメントを作成したい場合、public-html@w3.org(購読、アーカイブ)に送信されたい。
Working Group Noteとしての公開はW3Cメンバーの支持を意味するものではない。この文書は草案であり、いつでも更新、他の文書による置き換えや廃止扱いにされうる。進行中の作業以外のものとしてこの文書を引用することは不適切である。
この文書は2004年2月6日のW3C特許ポリシーの下で活動するグループによって作成された。W3Cは、グループの成果物に関するあらゆる開示特許の公開リストを管理する。ここには、特許開示にあたっての指示も含まれている。特許について十分に知識のある人物が、仕様にEssential Claim(s)が認められると判断した場合は、W3C特許ポリシーの第6章に従い情報を開示する必要がある。
この文書は、2015年9月1日付のW3C Process Documentによって管理される。
非規範的とマークされる節と同様に、この仕様におけるすべてのオーサリングガイドライン、例、および注は、非規範的である。この仕様におけるその他すべては規範的である。
この仕様においてキーワードMUST、MUST NOT、REQUIRED、SHOULD、SHOULD NOT、RECOMMENDED、MAY、OPTIONALは、[RFC2119]で示されたとおりに解釈される。
この節は非規範的である。
整形式のXML文書でもあるHTML5文書を提供できることは、時として貴重である。たとえば、著者は文書を生成するXMLツールを使用してもよく、著者とその他は、XMLツールを使用する文書を処理してもよい。HTMLとXMLの両方パーサで解析可能な文書を作成するために使用される言語は、ポリグロット・マークアップと呼ばれる。ポリグロット・マークアップはHTML5文書とXML文書の両方である文書の重なり言語である。これらの文書は、text/html
(コンテンツがHTML対応のユーザーエージェントに送信される場合)、またはapplication/xhtml+xml
(コンテンツがXHTML対応のユーザーエージェントに送信される場合)のいずれかとして供給されることが推奨される。他の許容されるMIMEタイプは、text/xml
、application/xml
、およびサブタイプの4文字"+xml
"で終わるすべてのMIMEタイプである。[XML-MT]
ポリグロット・マークアップは堅牢な―完全に任意だが―HTML語彙のプロファイルである。すべてのウェブコンテンツはポリグロット・マークアップで作成される必要はなく、これは主として文書の堅牢性の増大を望む著者のためのオプションである。ポリグロット・マークアップは、制御された環境においておよびオーサリングツールに対して、最もよく機能し、有益なオプションになりうる。
コンテンツの二重のコピーを同時に維持しなくても、HTMLとXMLツールチェーンの両方にサービスを提供する強い希望がある際にポリグロット・マークアップは、公開に理想的である。さらに、単一ポリグロット・マークアップ出力は、同じコンテンツに対するHTMLとXHTML出力の両方を生成するよりも、生成するためのより少ないインフラストラクチャが必要である。軽量プロセス―クイックテストや手書きオーサリングさえも―が、HTMLとXHTMLの両方として公開されることを意図したコンテンツに適用された場合、特にそのコンテンツがツールチェーンを通して送信されない場合、ポリグロット・マークアップはまた有益である。
用途の最も一般的なコンテキストを対象としたXMLベースのHTMLツールやシステムは、ポリグロットの入力に依存することはできない。最大限の柔軟性のために、このようなツールは、XML互換のDOMやイベントストリームを生成するHTMLパーサを使用する技術を利用すべきである。
ポリグロット・マークアップの目標は、ウェブコンテンツ・アクセシビリティ・ガイドライン(WCAG)2.0が記述する方法で堅牢な構文である。:支援技術を含む、現在および将来のユーザーエージェントとの互換性を最大化する。
[WCAG20]
著者は、ポリグロット・マークアップの構文の利益を享受するために、堅牢性の利点を理解する必要はない。しかし、その利点を促進するために、ポリグロット・マークアップがセマンティックを追加しないことを理解する必要があり、そしてそれ自体はHTMLの趣なのはセマンティックと同じである。しかし、ポリグロット・マークアップは、オーサリング処理中を含む、セマンティックを維持するために動作する。他の関連仕様がまだ追加していないアクセシビリティ要件を追加しないように、ポリグロット・マークアップはまた、アクセシビリティを保証するものではない。しかし、ポリグロット・マークアップは必要な慣習に対する指示を通じてアクセシビリティを維持するために動作できる。
ポリグロット・マークアップは、そのシリアライゼーションがさまざまなパーサを使って再解析される際にセマンティックを保持する可能性がある方法で、 DOMツリーのシリアライゼーションに制約を定義することで堅牢性に接近し、それらは完全な機能を備えたことが、バグフリーのHTML5パーサ、多少のHTMLを認識するパーサ、さらにはXMLパーサ。
ほとんどの場合、ポリグロット・マークアップは、それらがHTML5に追加された際に"polyglotness"を考慮に入れる多くはHTMLとXHTMLがそれぞれ規定する妥当性制約と構文要件のまさに純粋な推論である。しかし、堅牢性の理由のために、この仕様は時に必要とされている最小公倍数の原則よりも、さらに踏み込む。
たとえば、シリアライゼーションで制約のセットに含まれているものは、UTF- 8エンコーディングを使用するための要件である。理論的な可能性だけでなく、唯一のオプションとしてUTF-8の選択は、堅牢性の基本原理によって正当化される。たとえば、誰かがKOI8-R
エンコーディングの使用を選択した場合、HTMLの適合やXMLの整形式要件の副作用として、著者ははXMLパーサをサポートするために(MIME Content-Type
のような)より上位のプロトコルに依存することを余儀なくされるだろう。UTF-8を要求することにより、その副作用が回避される。
堅牢な構文を使用すると、より低い能力のパーサで、より高い信頼性の解析をする文書を有効にすることができる。しかし、たとえ文書が完全にHTML5に準拠するツールによって解析されかつ検証されることが期待できたとしても、ポリグロット・マークアップは堅牢性を追加する。一例として、HTMLとしてシリアライズされる場合、p
要素の終了タグは完全に任意であり、存在しない場合は推測される。しかし、終了タグを含めることはXMLによって、ひいてはポリグロット・マークアップによって要求されており、転送サイズのわずかな増加(多くの場合、圧縮することで増加は軽減される)以上に害を引き起こさないが、バリデータが状況を検出することができる。ここで、暗黙の終了規則は作者が意図したものと一致しない。
XMLベースのポリグロット・マークアップ構文は、堅牢性を高めるための唯一の方法ではないことに注意する。たとえば、HTMLバリデータやオーサリングツールは、これがHTML構文で必要とされない場合であっても、終了するすべてのタグを必要とするかもしれない。
ポリグロット・マークアップは以下をもたらす:
xml
(xml:lang
、xml:space
、およびxml:base
)、 xmlns
(xmlns=""
およびxmlns:xlink=""
)、およびxlink
(xlink:href
のような)属性にに対して異なるDOMを生成する。特定の場所でこれらの属性をXMLは要求し、HTML5は許可し、属性はHTMLパーサによって保存される。妥当なHTML文書であるような必要条件を例外は破ってはならない。
ポリグロット・マークアップは、最大限のサポートと最小限のオーサリングの選択を意味する構文によって、堅牢な構文を明示する。
サポートは最大化される:
オーサリングの選択は最小化される
ポリグロット・マークアップは以下を考慮しない:
ポリグロット・マークアップはXMLの規則に従ってスクリプトを記述され(たとえば、document.write
を使用しない)、XMLパーサーで複製することは不可能なHTML要素を除外する(たとえば、noscript
要素を使用しない)。非互換モードはDOMとCSSの両方に関連して、XMLモードのレンダリングに最も近いような、ポリグロット・マークアップは、HTMLパーサに非互換モードをトリガーする。ポリグロット・マークアップは、HTMLモードとXMLモードの両方で同じエンコーディングと同じ言語をもたらす。
自身が妥当なHTML5である、ポリグロット・マークアップは、拡張がポリグロット・マークアップの規則に違反しない限り、HTML5の2.2.3節 拡張性で定義されているように拡張性をサポートする。[HTML5] さらに、整形式のXMLであり、application/xhtml+xml
として提供される場合にポリグロット・マークアップは拡張されうる。
処理命令およびXML宣言はポリグロット・マークアップにおいて禁止する。
ポリグロット・マークアップはUTF-8文字エンコーディングを使用し、HTMLとXMLの両方が要求する唯一の文字エンコーディングをサポートする。HTMLは、レガシーエンコーディングにフォールバックするのを避けるために明示的に宣言されるようUTF-8を要求する。[HTML5]
XMLの場合、UTF-8はエンコーディングデフォルトである。文書がtext/html
として解釈される可能性がある場合に文書はそのように解釈すべきであるが、文書はXMLコンテンツタイプで提供され、したがってHTMLエンコーディング宣言方法のいずれも使用する必要はない。
ポリグロット・マークアップは、個別にまたは組み合わせて使用されてもよい、以下の方法でUTF-8文字エンコーディングを宣言する (ただし単一のHTMLエンコーディング宣言のみ存在できることに注意する):
<meta charset="UTF-8"/>
由来のcharset
属性で<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
由来の代替で"charset=utf-8"
をMIME/HTTP Content-Typeヘッダー[HTTP11]に加えることによって: Content-type: text/html; charset=utf-8
Content-type: application/xhtml+xml; charset=utf-8
charset=UTF-8
は安全に省略されることができることに注意する。
Content-type: application/xhtml+xml
XMLとHTMLの両方のパーサーは、バイト順マークをサポートする必要がある。HTMLエンコーディング宣言はXMLでは効果がない。HTMLエンコーディング宣言だけエンコーディング宣言される場合、XML由来のエンコーディングのデフォルトは、XMLパーサーがUTF-8としてコンテンツを扱うことができる。
視覚的にドキュメントのエンコーディングをチェックするために、開発者、テスト担当者、または翻訳生産管理者を支援するため、常に、ドキュメントに表示エンコーディング宣言を含めることをW3C国際化(i18n)グループは推奨する。
ポリグロット・マークアップは、[HTML5]の8.1.1節で指定された文書型宣言(DOCTYPE)を使用する。また、DOCTYPEは次の規則に適合させる。
DOCTYPE
は大文字である。SYSTEM
は大文字である。PUBLIC
は大文字である。about:legacy-compat
である場合、HTML5によって要求されるように、ポリグロット・マークアップは、小文字の文字列を含む。
文書型宣言で指定された妥当なXMLに対する文書要素は、万が一も含めて、文書の最上位の要素と正確に一致しなければならない。この規則は、妥当なXML文書よりむしろ、整形式のものに対してに緩和される。XHTMLは小文字のhtml
要素を要求するため、ポリグロット文書は、DOCTYPE宣言で指定された要素のために小文字のhtml
を使用すべきである。文書内の文書型定義サブセットの内側の要素および実体宣言をもつカスタマイズされたXHTML DTD、または代替DTDを指すものは、特別な場合の要件を持ってもよいことを念頭に置く。
XMLにおいてabout:legacy-compat
を用いることは、XML処理パイプラインに依存し、予測できない解析結果を生じるかもしれないことに注意する。
文書型宣言がXHTMLと互換性がないように、文書型宣言がURIを含むかどうかに関わらず、およびHTML5パーサでの効果に関わらず、ポリグロット・マークアップは、HTML4、HTML3、またはHTML2の文書型宣言を使用しない。
以下の規則は、ポリグロット・マークアップで使用される名前空間に適用する。
[HTML5]は、 ルートHTML要素html
、ルートSVG要素svg
、およびルートMathML要素math
に対して宣言されない(ネイティヴの)既定名前空間を導入する。XMLの互換性を維持するために、マークアップ言語が文書に含まれる際、ポリグロット・マークアップは以下のデフォルト名前空間を宣言する[XML10]:
<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">
ポリグロット・マークアップは、ルートHTML要素html
、ルートSVG要素svg
、およびルートMathML要素math
で、およびSVGまたはMathML要素の子として使用される任意のHTML要素上でデフォルト名前空間を宣言する。[HTML5]がネイティヴに他のデフォルト宣言または接頭辞要素名前空間の宣言をサポートしないため、ポリグロット・マークアップは、他のデフォルトまたは接頭辞要素名前空間を宣言しない。
[HTML5]は、XLink名前空間でおよび接頭辞xlink:
をともなう属性に宣言されない(ネイティヴ)サポートを導入する。XML互換性を維持するために、ポリグロット・マークアップは、明示的にXLink名前空間xmlns:xlink="http://www.w3.org/1999/xlink"
を宣言する。[XML10]
HTML仕様の適合性規則に適合するために、宣言は、任意のxlink:
接頭辞属性を使用する前に発生しなければならないため、宣言が使用される場合、一般的にそのようなセクションのルート要素上(たとえば、SVGセクションのsvg
開始タグ上およびMathMLセクションのmath
開始タグ上)で、宣言はそれぞれの外部コンテンツに参加する必要がある。
xlink:actuate
xlink:arcrole
xlink:href
xlink:role
xlink:show
xlink:title
xlink:type
xml:base
、xml:lang
、xml:space
、およびxml:id
で使用されるxml:
名前空間接頭辞は、XML文書で宣言される必要はなく、したがってポリグロット・マークアップはxmlns
経由でこれらの接頭辞を宣言しない。接頭辞は暗黙的にXMLで宣言され、HTMLで適切な属性に自動的に適用される。この属性をもつCSSセレクタを使用する方法についてはCSS名前空間[CSS3NAMESPACE]を参照のこと。
接頭辞ありおよびなしで、属性セレクタおよび名前空間に関連する問題の詳細については、スクリプティングとスタイリングポリグロット・マークアップのセクションを参照のこと。
ポリグロット・マークアップは、要素に関する以下の規則に適合させる。
ポリグロット・マークアップは、オプションのタグを使用しない。オプションのタグのHTML5のコンセプト―開始タグおよび/または終了タグの欠損―は、コードがそれらのタグが含まれない場合、HTMLパーサ自身が自動的にDOMに追加する要素を隠す。XMLは、欠損する開始および/または終了タグをDOMに追加するそのような機能を持たないため、ないのと同じ、両方のタグが省略されている場合、ポリグロット・マークアップでタグの省略は、両方のタグが省略される場合、整形式でない要素を生成することと等価か、一切要素を追加しないのと等価である。
そのポリグロット・マークアップはオプションのタグを操作せず、たとえば、そのマークアップにおけるtbody
タグの追加に使用されない著者に対して、またはp
要素の終了タグを省略することに慣れている誰かに不意打ちを引き起こすかもしれない。しかし、タグに関して整形式にするための要件は、基準以下のパーサおよびオーサリングの不意打ちに対してコードを堅牢にするポリグロット・マークアップの鍵となる特徴である。
したがって、すべてのポリグロット・マークアップ文書は、html
、head
、title
、body
要素を含む。html
要素はルート要素である。head
およびbody
要素は、 html
要素の子である。title
要素はhead
要素の子である。したがって、以下は、最も基本的なポリグロット・マークアップ文書になる。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> <head> <title></title> </head> <body> </body> </html>
noscript
要素はXML文書で使用できないため、ポリグロット・マークアップは、noscript
要素を使用しない。[HTML5]
ポリグロット・マークアップは、HTML、XHTMLまたは両方で除外される一切の要素を使用すべきでない。たとえば、文書内で適合しない機能で記載されるすべての要素を含むことは、ポリグロット・マークアップでない文書のリスクを増大させる。
以下は、マークアップ、スクリプト、またはCSSにおいて、要素名、属性名、またはの属性値のいずれかの用法に適用される。ポリグロット・マークアップは、すべてのASCII文字に対して小文字を使用する。非ASCII文字―ギリシャ文字、キリル文字、あるいは非ASCIIラテン文字など―に対して、ポリグロット・マークアップは、要求されるように、大文字・小文字の区別を尊重する。
ポリグロット・マークアップが混合活字ケースを使用する以下のSVG要素名を場合を除き、ポリグロット・マークアップは、すべてのHTML要素名、すべてのMathML要素名、すべてのSVG要素名に対して小文字を使用する:
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
ポリグロット・マークアップは、すべてのHTML要素に対する属性名、ポリグロット・マークアップが小文字definitionurl
を混合活字ケースdefinitionURL
に変える場合を除いたすべてのMathML要素名、ポリグロット・マークアップが混合活字ケースを使用する、以下のSVG属性名を除くすべてのSVG属性名に対して小文字を使用する:
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
属性値における文字について、ポリグロット・マークアップは、マークアップ、DOM API、およびこれら属性がHTML要素で使用されるCSSとの間の活字ケースの整合性を維持する。
ポリグロット・マークアップは、MIMEタイプ、言語タグ、文字セット、真偽値、メディアクエリ、およびキーワードで発生する次の属性上の値に対する活字ケースの整合性を維持する。必須でないが、活字ケースの一貫性を維持する簡単な方法は、これらの属性に対して小文字の値のみを使用することである。セレクタマッチングのために、XMLで属性値がすべて大文字・小文字区別であるように扱うため、ポリグロット・マークアップは、これらの値に対する活字ケースの整合性を維持する。しかしHTMLは、大文字・小文字不区別としてこれらの属性の値を扱う(HTML5仕様、4.15.1 Case-sensitivityを参照のこと)。[HTML5]
accept
accept-charset
charset
checked
defer
dir
direction
disabled
enctype
hreflang
http-equiv
media
method
multiple
readonly
rel
(コロンを含まない値の場合) scope
selected
shape
target
(キーワードのみ。ブラウジングコンテキスト名は大文字・小文字区別である)type
(a
、link
、object
、script
またはstyle
要素で)type
(inputで)RDFaのような他の仕様は、特定の属性の許容値に追加の制約を課すかもしれないことに注意する。
また、XMLプロセッサは、言語情報を含むものとしてlang
を認識しないため、ポリグロット・マークアップは(言語属性を参照)lang
とおよびxml:lang
属性の両方を使用することに注意する。しかし、CSS3セレクタ仕様では、xml:lang
を含む言語属性が大文字・小文字不区別な方法で一致されるよう規定する。[SELECT]
HTML文書を含む異なる種類の要素に対して、ポリグロット・マークアップは以下のコンテンツの規則に準拠する。
HTML構文において、空要素は常に空であり、終了タグを一切持たない要素である。HTML仕様や拡張仕様において空として挙げられるすべての要素は、ポリグロット・マークアップにおいてXML空要素タグ( <foo/>
)の構文形式を持たなければならない。他の要素は、XML空要素タグの構文を使用してはならない。HTML仕様の空要素は次の通り[HTML5]:
area
,base
,br
,col
,embed
,hr
,img
,input
,keygen
,link
,meta
,param
,source
,track
,wbr
例: ポリグロット・マークアップは、空要素に対して<br/>
のような空要素タグ構文を使用し、<br></br>
を使用しない。
例: コンテンツモデルが空でない要素の空のインスタンスを与えられる(たとえば、空のタイトルや段落)ポリグロット・マークアップは、空要素タグ構文を使用しない。つまり、文書は<p></p>
を使用し、<p/>
を使用しない。
MathMLおよびSVG要素のような外来コンテンツにおける要素は、空要素タグ使用するか、コンテンツを含むかのいずれかであってもよい。
script
およびstyle
)ポリグロット・マークアップにおいて、 HTML仕様や拡張仕様において生テキスト要素として挙げられるすべての要素のコンテンツは、この節で定義される特別な要求事項に適合させなければならない。
HTML5は以下の生テキスト要素を定義する:
script
,style
HTMLにおいて、script
およびstyle
要素のコンテンツは、あたかも生テキスト要素はCDATAであったかのように扱われ、そのため&
および<
は、これら要素が要素を閉じる終了タグとして出現する場合を除き、特別でない。しかしXHTMLにおいて、同じ構成要素は、タグ、文字参照、CDATAなどとして扱われる。
曖昧な文字列 | 情報 | HTMLの解釈 | XMLの解釈 | |
---|---|---|---|---|
<![CDATA[ セクション]]> の内側の場合 | <![CDATA[ セクション]]> の外側の場合 |
|||
< |
小なり記号 | 解釈されない(ただし</script および</style 列を参照のこと) |
解釈されない | 解釈される (コメントタグ、コメント、CDATA) |
& | アンパサンド | 解釈されない | 解釈されない | 解釈される 文字参照または実体を開始する |
<!-- | コメントの開始 | 部分的に解釈されない | 解釈されない | 解釈される |
--> | コメントの終了 | 部分的に解釈されない | 解釈されない | 解釈される |
<![CDATA[ | CDATA宣言の開始 | 解釈されない | 解釈されない | 解釈される (CDATAブロックを開始する) |
]]> | CDATA宣言の終了 | 解釈されない | 解釈されない | 解釈される (CDATAブロックを終了する) |
cdata content | CDATAセクションのコンテンツ | 解釈されない | — | |
</script | script 要素の内側に発生しかつ"tab" (U+0009), "LF" (U+000A), "FF" (U+000C), "CR" (U+000D), U+0020 SPACE, ">" (U+003E)、または"/" (U+002F)のいずれか1つが続く | 親を終える | 解釈されない | 親を終える |
</style | style 要素の内側に発生しかつ"tab" (U+0009), "LF" (U+000A), "FF" (U+000C), "CR" (U+000D), U+0020 SPACE, ">" (U+003E)、または"/" (U+002F)のいずれか1つが続く | 親を終える | 解釈されない | 親を終える |
<foo></bar> | その他すべてのタグ、整形式かどうか | 解釈されない | 解釈されない | 解釈される通常の解析規則を仮定して |
&#foo; | 文字参照 | 解釈されない | 解釈されない | 解釈される通常の解析規則を仮定して |
上記の文字列のいずれでもない | 任意の他の文字列 | 解釈されない | 解釈されない | 解釈されない |
構文的に、ポリグロットのサブセットは以下で発見される
CDATA
セクションでコンテンツを包むことによって制約の違いを均一にすることを試みる。CDATA
コードは、HTMLパーサによってテキストとして見られている(したがって、スクリプトやスタイル言語を妨害できる)。一方でXMLパーサは、マークアップセマンティクスなしでにテキストとしてコンテンツを見る。安全なテキストコンテンツにコンテンツを制限することは、より多くの計画とコードの制御を必要とするが、それはスクリプトやスタイル言語を機能させるために余分で潜在的に破壊可能なコードを必要としないため、CDATA
オプションよりも堅牢であると言える。一方CDATA
オプションは、著者が安全なテキストコンテンツの制限を意識しないため、またはコンテンツが安全であることを保証できないツールによってコードが挿入されるため、発生する可能性がある様々なエラーに対してより多くの自由と堅牢性を提供する。
ポリグロット・マークアップは、外部と内部の両方に安全なテキストコンテンツを配信できる。
<
および&
だけでなく、CDATA
終了マーク文字列―]]>
を使用しないことを意味する。ポリグロット・マークアップは、それら文字が妥当であるように、文字実体か数値文字参照かを使用するかどうかに関して不可知論である。つまり、ポリグロット・マークアップに対して、&
と<
に違いはない。
CSSに対して、インラインの安全なテキストコンテンツのオプションは、<
および&
として、ほとんどの場合非常によく働き、CSSの重要な部分でなく、非常に頻繁に使用されないであろう。しかし、それがJavaScriptに至る場合、&
および<
は、言語の鍵となる動詞(オペレーター)であり、したがってすぐにトラブルになる― 外部の安全なテキストコンテンツを使用するのがより良い。
曖昧な文字列を使用するための回避策は、style
やscript
のsrc
属性の内側に適切にエスケープ文字を含めることである。
ポリグロット・マークアップは、 CDATA
セクションに包まれた生テキストコンテンツを受け入れる。しかし、(まさにCDATA終了マーク文字列―]]>
を除いて )あらゆるコンテンツ許可する代わりに、特定の生テキスト要素のHTMLの制約に対応するサブセットのみが許可される。上記表の解析の違いにおける「HTMLの解釈」欄を参照のこと―テキスト「解釈しない」をもつすべてのセルはまた、CDATAとして解釈されず、したがって、CDATAの安全なサブセットを構成する。
CDATAセクションにおいて生テキストを包むことは、新たな問題をもたらす。HTMLとして実行される場合 、CDATAセクションの開始および終了マークは、スクリプトまたはスタイルシートのインタプリタによって見られ、したがって構文エラーが発生しても、スクリプトおよびスタイルシートの実行を停止できる。解決策は、スクリプトまたはスタイルシート言語のコメント方法を使用して、CDATA開始および終了マークをコメントアウトすることである。さらに、script
がコードブロックコンテナとして使用される場合のように、XMLコメントの内側で非表示にすることで、スクリプト/スタイリングコメントをコメントアウトする必要があるかもしれない。
以下規則は、CDATAがCSSに対する使用を制限することを前提としている。
一般的な規則:
<script>
および<style>
上のHTMLの制限事項を前提としている。「CDATAセクションは、要素を含むそのセクションの最初に出現しなければならず、したがってその要素の最初の子でなければならない。」という記述は、パーサが文字および空白に基づいてDOMノードを作成してもよい方法のためである。次のスクリプト要素がCDATAノードの外側に空白を含まないため、この要素は、HTMLとして解析されようとXMLとして解析されようと、1つのノードを持つ:
<script><![CDATA[foo]]>/<script>
著者は、CDATA「開始タグ」と「終了タグ」をコメントアウトする必要があるかもしれないので、ポリグロット・マークアップはCDATAセクションの前後に1つのノードを可能にする。次の例は、CDATAセクションの前に1つのテキストノード、CDATAセクション自身の1つのノード、およびCDATAセクションの後に1つのノードの、3つのノードを持つ:
]]>
文字列は:
<![CDATA[
がコメントアウトされる場合、常にコメントアウトされる。<![CDATA[
がコメントアウトされる場合、一切コメントアウトされない。<script> //<![CDATA[ Foo; //]]> </script>
<![CDATA[
文字列は3つの方法で操作されうる:
<![CDATA[
― コメントアウトせずに
<script type="not-CSS-and-not-JS"><![CDATA[foo]]></script>
コメントアウトすることなく<![CDATA[
ブロックを使用することは、HTMLとして解析される場合、type="text/css"
またはtype="text/javascript"
コンテンツとして適合しない。
//<![CDATA[
―ブロック全体に対してスクリプト言語のコメントを使用する。
<script>//<![CDATA[ FOO; //]]></script>
コメントはCDATAセクションの前にノードで開始していることに注意する。
<!--//--><![CDATA[
―2と同じだが、スクリプトのコメントは、XMLコメント内に隠される。
<script><!--//--><![CDATA[ FOO; //]]></script>
スクリプト言語が、 構文的に正当として<!--
を受け入れなければならないことに注意する。JavaScriptはそうであるが、他のスクリプト言語ではそうでないかもしれない。
このアプローチはCSSに対応する。しかし、上記の規則2は妥当性を防止する。
script
におけるコメント構文ポリグロット・マークアップは、script
要素内のコメントの内側に開始<script>
タグを配置しない。HTMLパーサがscript
要素内のコメントの内側に開始<script>
タグに遭遇する場合、互換性関連の理由のため、終了コメント文字列(-->
)が最初に出現しない限り、それは次の</script>
終了タグ上で要素を閉じない。代わりに、パーサが最初に任意のコメント最後を参照しない場合、要素は、2つ目の</script>
終了タグで閉じられる。コメントと2つ目の<script>
要素の終了タグも見つからない場合、文書の残りの部分はコメントアウトされる。この動作は、style
要素で発生しないことに注意する。
エスケープ可能な生テキスト要素は、文字参照が許可されているが、HTMLパーサがテキストとしてではなくマークアップとして要素を扱う要素である。ポリグロット・マークアップに対して、エスケープ可能な生テキスト要素は、以下のとおり:
title
textarea
文字実体がエスケープ可能な生テキスト要素に対して許可される場合を除いて、ポリグロット・マークアップは、エスケープ可能な生テキスト要素のための安全なテキストコンテンツと同じ規則を使用する。
外来コンテンツ要素の正確な規則は、それぞれの仕様で定義される。
他に指定される場合を除いて、要素は、ポリグロット・マークアップに適用するもの以外の特別な制限はない。
XML文書においてiframe
にHTML仕様は特別な抑止を設定するため、iframe
要素はポリグロット・マークアップで制限を持つ。[HTML5]
textarea
およびpre
要素における改行ポリグロット・マークアップはtextarea
またはpre
要素のいずれかを使用する場合、要素内のテキストは改行で始めるべきでない。これは、HTMLおよびSGMLベースシステムは最初の改行を削除する一方で、XMLパーサは削除しないためである。
ポリグロット・マークアップは、引用符ですべての属性値を囲む。ポリグロット・マークアップは、単一引用符または二重引用符のいずれかで属性値を囲む。
ポリグロット・マークアップは、属性内で直接入力した改行文字を使用しない。
属性値の中で、ポリグロット・マークアップは、リテラル文字を使用するよりむしろ数値文字参照として、タブ、ラインフィードおよびキャリッジリターンを表す。たとえば、属性値の中で、ポリグロット・マークアップは、逐語的にリテラルな'\t'
ではなくタブのために	
を使用する。これは、XMLにおいて属性値の正規化のためである。[XML10]コメントは、ソース行の終わりではなく、全属性値の最後でコメントアウトしてしまうので、属性値内のJavaScriptおよびCSSは、属性値の正規化の影響を受けていることにも注意すること。
次の例は、srcdoc
属性内でラインフィード、タブ、および小なり記号文字の数値文字参照(エスケープされた文字)を使用している。
<iframe srcdoc="<p>Hello 
 	 world!</p>" src="demo_iframe_srcdoc.htm"></iframe>
XMLで属性値の正規化のために[XML10]、ポリグロット・マークアップは、属性内で改行文字を使用しない。事実上、属性内で改行を伴うソースコードに対して、XMLおよびHTMLを介して生成するDOMは異なる。しかし、空白の違いがない限り、ページには何の影響も与えない:
@alt
のコンテンツとして、コンテンツが視覚的にレンダリングされる属性で使用される。直接入力される改行文字はURIを含む任意の属性において明らかに使用できないことに注意する。
属性値も参照のこと。
次の属性は、ポリグロット・マークアップ内のHTMLまたはXHTMLにおいて許可されない。これらの属性は、XMLとして解析される文書において効果を持つが、text/html
として解析される文書において影響はない。したがって、HTML5の仕様はtext/html文書において無効としてそれらを定義する。[HTML5]
xml:space
xml:base
xml:space
およびxml:base
属性は、SVGおよびMathML要素で許可されることに注意すること。したがって、これら属性が外来コンテンツとしてSVGまたはMathML内に出現する場合、属性はポリグロット・マークアップにおいて出現してもよい。
要素の言語へのマッピングを指定する場合、ポリグロット・マークアップは、lang
とxml:lang
属性の両方を使用する。いずれの属性も他のものなしで使用されるべきでなく、ポリグロット・マークアップは、lang
とxml:lang
の両方のための同一の値を維持する。
ルート要素は、常に言語を指定すべきである、さもないと、HTMLのフォールバック言語の効果は、参加してもよく、かつ文書がXMLとして消費される(フォールバック言語が動作するために必要とされていない場合)またはfile
URIを経由して消費される(外部Content-Language
を経由してフォールバック言語が動作しない場合)かどうかに依存して言語が変化する。内部http-equiv="Content-Language
meta
要素は、HTML5に不適合であることに注意する。詳細については、たとえば、HTML5の言語決定規則を参照のこと。
次の属性またはその検討は、ポリグロット・マークアップのための一般的な規則に対する例外を必要とする。
id
属性
ポリグロット・マークアップは、id
属性値内で一切の空白文字を含まない。これは、id
属性値がHTML5で空白文字を含まないかもしれないためである。[HTML5]
ポリグロット・マークアップは、すべてのid属性が文書内で一意でなければならず、文字で始まる、正当なXML名でなければならないことを保証する。[XML10]
ポリグロット・マークアップは以下の名前実体参照を使用する:
amp
lt
gt
apos
quot
前のリストを超える実体に対して、ポリグロット・マークアップは文字参照を使用する。たとえば、ポリグロット・マークアップは、
の代わりに 
を使用する。ポリグロット・マークアップ(前の例で、 のような)エスケープ文字に10進値を使用してもよいことに注意する。しかし、Character Model for the World Wide Webは、両方が利用可能な場合、コンテンツが10進形式よりもむしろ16進形式の文字エスケープを使用すべきであると推奨する。[CHARMOD]
これらは文字として使用される場合、ポリグロット・マークアップは、常に小なり記号(<
)およびアンパサンド(&
)のための文字参照を使用し、しかし、外来コンテンツの内側のCDATA、コメント内の文字および安全なCDATAに対して、以下の規則が適用される:
script
およびstyle
要素について、安全なCDATAのための規則で定義されるように、それらは使用されてもよい。JavaScriptおよびCSSをポリグロット・マークアップに適用する場合、目標は、HTMLまたはXMLとして消費されるかどうかに関わらず同じ結果を得ることである。したがって、XMLとHTMLで異なる結果を与えるスクリプトやスタイルの機能を認識することが重要である。この問題は、生テキスト要素に対してポリグロット使用規則に加える。
innerHTML
対document.write()
document.write()
およびdocument.writeln()
はHTMLで動作するが、どちらの機能もXHTMLで動作しない。ポリグロットの代替は、HTMLとXHTMLの両方に対して動作するinnerHTML
プロパティである。
innerHTML
プロパティは、文字列を取得する。しかし、HTMLパーサがHTMLにおいてHTMLとしてその文字列を解析する一方で、XMLパーサはXHTMLにおいてXMLとしてその文字列を解析する。そして解析におけるこの違いのために、innerHTML
が挿入するコードは、ポリグロット・マークアップのためのガイドラインに従わなければならず、その結果XMLパーサによって生成された結果のDOMは、HTMLパーサによって生成されたDOMと相違ない。
CSSは、著者がいわゆる属性セレクタ[attr]{property:value}
を使用してその属性を参照することで要素の選択を有効にする。一般に、ポリグロット・マークアップは、属性に影響しないデフォルト名前空間に依存するため、属性セレクタは自由に使用できる。
しかし、ポリグロット・マークアップに要求される属性の一部は、名前空間付けされる。xmlns
のように、一部はデフォルトで名前空間付けされる。一部の属性は、xml:
、xmlns:
およびxlink:
のようにデフォルトで名前空間付けされる接頭辞によって名前空間化される。さらに拡張仕様は、HTML仕様で定義されたもの以外であっても、他の名前空間付けされた属性を許可してもよい。その結果、属性が名前空間に関連付けされる場合、[xmlns]{rule:foo}
のようなセレクタは、XHTMLで動作しない。接頭辞付けられた属性に対しても厳密に同じである。たとえそれがコロンをエスケープしたとしても([xml\:lang]{rule:foo}
)、そのようなセレクタはHTMLでのみ動作する(xlink:
に対する名前空間宣言を除く。これはXMLでおよびHTMLで動作し、そして両方の構文で名前空間化された方法で選択されなければならない。)
XMLで名前空間付き属性を選択可能にするために、属性セレクタは名前空間接頭辞を含まなければならない。[SELECT]
接頭辞のない、名前空間付き属性xmlns
属性の場合、HTMLとXMLの両方で動作するポリグロット・セレクタは、属性の名前空間に関係なく、セレクタがすべての属性名を一致することを示す、名前空間接頭辞にアスタリスク(*
)を使用して作成できる。
[*|xmlns]{color:lime}
次に、接頭辞付き属性について、ポリグロットマークアップ
でなく、 HTML仕様の規則のために、xml:lang="foo"
の存在を指示するそれ自身が、対応するlang="foo"
を伴わなければならず、準拠するポリグロット文書において、 それはxmlns
属性と同じアプローチを使用できる。
[*|lang]{color:lime}
しかし、xml:lang="foo"
とlang="foo"
の両方を使用するポリグロット・マークアップの要件は、XMLパーサとHTMLパーサの両方で、[lang]{color:lime}
でさえも動作することを意味する。
ポリグロットsvg
要素のために必要とされるxmlns:xlink
属性に関しては、xml:lang
とは対照的であるため、HTML/XHTMLにおける外来コンテンツ要素に属し、HTMLで名前空間付けされる。したがって、唯一の方法―HTML内だけでなくXML内で― セレクタとしてこの属性を使用することは、CSSでxmlns:
接頭辞の名前空間を宣言することによってである。
@namespace xmlns "http://www.w3.org/2000/xmlns/";
[xmlns|-xlink]{border:dashed lime 3px}
ユーザーエージェントがCSSおよび/またはマークアップで名前空間をサポートしない場合で、1つのセレクタより多くを使用することが必要である。著者が接頭辞を宣言する場合にこれは発生する可能性がある―デフォルトまたは接頭辞付き―ユーザーエージェントがCSS名前空間接頭辞を持つ属性セレクタをサポートしていない場合、拡張仕様で許可される。
/*Selector for legacy user agents without support for namespace prefixed attribute selector:*/
[xmlns],
/*Selector for user agents with support for namespace prefixed attribute selector:*/
[*|xmlns]
{color:lime}
以下のコード例は、ポリグロット・マークアップとして機能し、XHTMLまたはHTMLのいずれかとして検証する。http://dev.w3.org/html5/html-polyglot/SamplePage.htmlで、HTMLとして配信されるページ、およびhttp://dev.w3.org/html5/html-polyglot/SamplePage.xhtmlで、XHTMLとして配信される同一バイトで表示できる。
たとえば文書は'text/html'
として提供される。この例のように'text/html'
として提供される場合、一部のレガシーユーザーエージェントは、SVGをサポートしない。例のページは、'application/xhtml+xml'
として提供されうる、ファイル拡張子.htmlをもつ、ポリグロット・マークアップの遵守を維持し、SVGのレンダリングを可能にする。
<!DOCTYPE html> <html id="SampleDoc" xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>A Sample Page Using Polglot Markup</title> <meta charset='utf-8' /> <!-- The HTML encoding declaration (meta
element with thecharset
attribute) is used to declare the encoding ofor HTML parsers, in line with the section on Specifying a document’s character encoding --> <!-- Thelink
element is self-closing as described in the section on Void Elements --> <!-- Style commands are included by linking to an external file rather than including them in-line, as described in the section on The safe text content option forscript
andstyle
elements. --> <link type="text/css" rel="stylesheet" href="Sample.css"/> </head> <body> <nav><p><strong>NB:</strong> These bytes are available served as <a href="SamplePage.xhtml">XHTML</a> and as <a href="SamplePage.html">HTML</a></p></nav> <h1>Sample Page Using Polyglot Markup</h1> <p> The source code for <a href="#SampleDoc">this document</a> uses <dfn id="sampleDef">polyglot markup</dfn>, a document that is a stream of bytes that parses into identical document trees (with the exception of the xmlns attribute on the root element) when processed as HTML and when processed as XML. The source code for this document also contains additional comments about the use of <a href="#sampleDef">polyglot markup</a>. </p> <h2>Foreign Elements</h2> <p> The following shapes use SVG elements. <a href="#sampleDef">Polyglot markup</a> introduces undeclared (native) default namespaces for the the root SVG element (<code>svg</code>) and respects the mixed-case element names and values when appropriate, as described in the section on Element-Level Namespaces, the section on Element Names and the section on Attribute values. </p> <!-- <a href="#sampleDef">Polyglot markup</a> declares the xlink: namespace on the <svg> element to maintain XML-compatibility --> <svg width="350" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g> <title>Three SVG shapes</title> <desc> This SVG image contains an ellipse filled with a gradient that goes from white to blue as it moves outward from the center. A yellow rectangle with a black border overlaps the ellipse in the upper-left quadrant, and a red spiral on a white background overlaps the ellipse in the bottom-right quadrant. The red spiral is also a link to the example code for that SVG shape. </desc> <defs> <!-- Note that "radialGradient" and "myGradient" respect mixed-case values. --> <radialGradient id="myGradient" cx="50%" cy="50%" r="50%" fx="50%" fy="50%"> <stop offset="0%" style="stop-color:rgb(200,200,200); stop-opacity:0"/> <stop offset="100%" style="stop-color:rgb(0,0,255); stop-opacity:1"/> </radialGradient> </defs> <ellipse cx="50%" cy="50%" rx="50%" ry="42%" style="fill:url(#myGradient)"/> <rect x="0" y="0" width="100" height="100" style="fill: yellow; stroke: black;"/> <a xlink:href="http://www.example.org/foo"> <!-- Note that the following attribute contains newlines which will produce a different DOM, but will not affect the way in which SVG functions in the least. --> <path transform="translate(60, -175)" d="M153 334 C153 334 151 334 151 334 C151 339 153 344 156 344 C164 344 171 339 171 334 C171 322 164 314 156 314 C142 314 131 322 131 334 C131 350 142 364 156 364 C175 364 191 350 191 334 C191 311 175 294 156 294 C131 294 111 311 111 334 C111 361 131 384 156 384 C186 384 211 361 211 334 C211 300 186 274 156 274" style="fill:white;stroke:red;stroke-width:2"/> </a> </g> </svg> <h2>Void Elements</h2> <!-- Given an empty instance of an element whose content model is not EMPTY (in this case, an empty paragraph) <a href="#sampleDef">polyglot markup</a> does not use the minimized form, as described in Section 6.4 Void Elements --> <p></p> <p> There is an empty <code>p</code> element before this paragraph. <a href="#sampleDef">Polyglot markup</a> uses <code><p></p></code> and not <code><p/></code>. </p> <p> <a href="#sampleDef">Polyglot markup</a> treats certain elements as self-closing, void elements, such as the following <code>img</code> element. </p> <img height="48" width="72" alt="W3C" src="http://www.w3.org/Icons/w3c_home"/> <p> For more information, see the Void Elements section. </p> <h2>Required Elements</h2> <p> The following table uses the required <code>tbody</code> element, as described in the Required elements and tags section. </p> <table> <tbody> <tr> <th>Column One</th> <th>Column Two</th> </tr> <tr> <td>Row 1, Column 1</td> <td>Row 1, Column 2</td> </tr> <tr> <td>Row 2, Column 1</td> <td>Row 2, Column 2</td> </tr> <tr> <td>Row 3, Column 1</td> <td>Row 3, Column 2</td> </tr> </tbody> </table> <p> The following table makes use of the <code>col</code> element and therefore uses the then required <code>colgroup</code> element as <code>col</code> element wrapper for, as described in the Required elements and tags section. </p> <table> <colgroup> <col style="background-color:silver"/> <col style="background-color:gray"/> <col style="background-color:yellow"/> </colgroup> <tbody> <tr> <th>ISBN</th> <th>Title</th> <th>Price</th> </tr> <tr> <td>3476896</td> <td>My first HTML</td> <td>$53</td> </tr> <tr> <td>1234567</td> <td>Intermediate Polyglot</td> <td>$49</td> </tr> </tbody> </table> <h2>Named Entity References</h2> <p> The paragraph you now read, uses the string <code>&amp;</code> for ampersands (“&”) and uses, as described in the section on Named entity references, the string <code>&#xA0;</code> for a non-breaking space between the following two words: <i>“<a href="#sampleDef">polyglot markup</a>”</i>. </p> </body> </html>
Many thanks to Robin Berjon, David Carlisle, Daniel Glazman, Richard Ishida, Tony Ross, Sam Ruby, Jonas Sicking, Henri Sivonen, Manu Sporny, and Philip Taylor. Special thanks to the W3C TAG and the W3C Internationalization (i18n) Core Working Group.
4.10 コメント
ポリグロット・マークアップは、"
<!
"または"<!--
"のいずれかでコメントを開始する。ポリグロット・マークアップは、">
"または"->
"のいずれかでコメントを開始しない。