[22] [[HTML]]/[[XML]]/[[DOM]] においては色々な方法で[DFN[[RUBYB[[[識別子]]]@en[identifier]]]] ([DFN[[[ID]]]])
を指定できます。

[FIG(short list)[
- [23] [[DTD決定識別子]]
- [24] [[スキーマ決定識別子]] ([[属性]]、[[要素]])
- [26] [[利用者指定識別子]]
- [25] [[外部指定識別子]]
- [27] [CODE(XMLa)@en[[[xml:id]]]]
- [28] [[マーク付け言語]]によって定められた [CODE(XMLa)@en[[[id]]]] 属性
- [29] [[CSS要素参照識別子]]
]FIG]

* 属性値と要素内容

[30] [[属性値]]は通常[[属性値]]として指定されます。 [[DTD]] などによる[[識別子]]の指定は、
[[識別子]]として使われる[[属性値]]が与えられる[[属性]]を指定することによって行われます。

[31] 例外的に、 [[XML Schema]] では[[単純型]]の[[属性]]と[[要素]]は同じように扱われることが多く、
[[識別子]] ([CODE(XML)@en[[[xs:ID]]]]) である[[要素]]も定義できるようになっています。
ただしこれは現実にはなかったことにされる傾向にありますwww

* 応用

[32] [[識別子]]は、[[素片識別子]]の値として、 [CODE(DOMm)@en[[[getElementById]]]] による検索の値として、
[[ID選択子]]の値として、 [CODE(XML)@en[[[IDREF]]]] [[属性値]]としてなどいろいろな場面で[[文書]]中の特定の[[要素]]を識別するために用いられます。

* [CODE[id]] (MathML)

[13] [[MathML]] における [DFN[[CODE[[[id]]]]]] は、[[識別子]]であって[[文書]]中で固有のものです。
[[XML 1.0 5e]] の [CODE(XML)@en[[[NAME]]]] の構文に従っていなければなりません。

;; [12] [CITE[MathML Fundamentals]] ([TIME[2010-10-21 05:51:46 +09:00]] 版) <http://www.w3.org/TR/2010/REC-MathML3-20101021/chapter2.html#type.id>

[14] なぜ [CODE(XML)@en[[[ID]]]] の定義を参照していないのでしょうね。
[[DTD]] 依存になってしまうのを避けるためでしょうか。

[15] ところで [[XML]] に「[CODE(XML)@en[[[NAME]]]]」はないですね。[[SGML]]
時代を惜しんでいるのかw、それとも [CODE(EBNF)@en[[[Name]]]] の間違いなのか。

* 歴史

** ID 型 (SGML)

@@ 

** ID 型 (HTML 4)

[5] まあ [[HTML 4]] の [CODE(SGML)[ID]] 型といっても、
[[SGML]] の [CODE(SGML)[ID]] 型そのものなのでありますが・・・。

HTML 4 の [[SGML宣言]]の状況下では、
- [CODE(ABNF)[[DFN[ID]] := [[ALPHA]] / [[DIGIT]] / "-" / "_" / "." / ":"]]

なのです。 <IW:HTML4:"types.html#type-id"> 参照。

大文字・小文字の区別はありません。 SGML
の規則により小文字は大文字に変換されます。

[7]
あ、1文字目は [CODE(ABNF)[ALPHA]] でないと。

[[噂のID問題]]も。

** [CODE(XML)[ID]] 型 (XML)

[8] [[XHTML m12n]] の[[抽象モジュール]]定義における[[属性型]]
[DFN[[CODE(XML)[ID]]]] は、 [[XML 1.0]] の定義によっています。

仕様書:
- [[Web体系]]
-- [CSECTION@en[4.5.6. XML ID semantics]]
<http://www.w3.org/TR/webarch/#xml-id-semantics>
- [[XHTML m12n]]
-- [CSECTION[4.3. Attribute Types]]
<IW:XHTML1m12n:"abstraction.html#dt_ID">

- [xmlIDSemantics-32]
[CSECTION@en[How should the problem of identifying ID semantics in XML languages be addressed in the absence of a DTD?]]
<http://www.w3.org/2001/tag/issues.html#xmlIDSemantics-32>

[1] [[XML名前空間]]を使って [CODE(SGML)[ID]] 型属性を複数使えるか。例えば [[XHTML]] の要素に [CODE(XML)[[[RDF]]:[[ID]]]] 属性をつけることが出来るか。

[2] >>1 [[SGML]] でも [[XML]] でも、1つの要素に2つ以上の [CODE(SGML)[ID]] 属性は禁じている。よって出来ない。名前空間が違っても同じこと。

[3] [[XPath]] では、[[妥当]]でない文書も扱うわけですが、
そういう文書では同じ識別子を持った要素が複数あることもあります。
そういうときに、
[[文書順]]で2番目以降の要素は識別子を持たないこととして処理します。
<http://www.w3.org/TR/xpath#unique-id>

[4] >>3、簡単なことのように思えますが、
[SAMP(XPath)[[VAR[path/to/element1]]/id()]] と
[SAMP(XPath)[[VAR[path/to/element2]]/id()]]
が同じ値を返しちゃいけないわけです。
だけど常識的に
[SAMP(XPath)[[VAR[path/to/element1]]/@[VAR[id-attr]]]] と
[SAMP(XPath)[[VAR[path/to/element2]]/@[VAR[id-attr]]]]
は同じ値じゃないといけないでしょ?
だから構造木を作ったときにでも重複をチェックして、
それを覚えとかないと。
もちろん木を操作して別の要素に識別子を与えたり、
最初の要素の識別子を削除したりしたら、
それに同期してどの属性が有効かも変更しないといけないんです。

- [6] >>4 みたいな面倒なことするよりは、 [CODE(XPathf)[[[id]]]] 関数とか識別子を使う時に木を走査する方が安上がりですね。

[9]
>>3-6 元々 [[XPath]] のデータ・モデルや
[[XML情報集合]]的には、 [[XML]] [[実体]]の構文解析・妥当性検証の時点で[[識別子]]と[[要素]]の対応の一覧表を作って、
あとから[[識別子]]が必要になったらその表を引くことを想定しているのだと思われ。
([[名無しさん]] [sage])

[10]
[CITE[How should the problem of identifying ID semantics in XML languages be addressed in the absence of a DTD?]] <http://www.w3.org/2001/tag/doc/xmlIDsemantics-32.html>

[16] [CITE@EN[W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes]]
( ([TIME[2012-04-05 06:34:51 +09:00]] 版))
<http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/#ID>

[17] [CITE@EN[W3C XML Schema Definition Language (XSD) 1.1 Part 1: Structures]]
( ([TIME[2012-04-05 06:34:07 +09:00]] 版))
<http://www.w3.org/TR/2012/REC-xmlschema11-1-20120405/#sec-cvc-id>

[18] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#general-rules>

[19] [CITE@en[XQuery and XPath Data Model 3.0]]
( ([TIME[2014-04-08 07:00:06 +09:00]] 版))
<http://www.w3.org/TR/xpath-datamodel-3/#const-infoset-attribute>

** IOTP

[45] [CITE@en[RFC 2801 - Internet Open Trading Protocol - IOTP Version 1.0]], [TIME[2021-04-11T11:36:33.000Z]], [TIME[2021-04-12T11:51:33.922Z]] <https://tools.ietf.org/html/rfc2801#section-3.5>

** Web Forms 2.0

[20] [CITE@EN[XPath and XQuery Functions and Operators 3.0]]
( ([TIME[2014-04-08 07:02:07 +09:00]] 版))
<http://www.w3.org/TR/xpath-functions-3/#func-element-with-id>
[11] [[Web Forms 2.0]] の[[反復フォーム制御子モデル]]では[[反復]]される[[要素]]の
[CODE(XMLa)@en[[[id]]]] [[属性]]に「[」や「]」のような [[XML]] 的に[[非妥当]]な[[文字]]を使っていますが、
[[非妥当]]であることに対する抵抗の声が大きく、[[名前文字]]だけで表現する方法も後に追加されました。

;; [CITE@en-GB-x-Hixie[Web Forms 2.0]] ([TIME[2009-01-05 20:07:15 +09:00]] 版) <http://www.whatwg.org/specs/web-forms/current-work/#addition>

** 識別子の重複

[33] '''SGML''':
[[SGML]] の [CODE(SGML)[[[ID]]]] 型の[[属性]]の値は文書内で固有でなければなりません。
この制約が満たされない SGML 文書は、[[型妥当]]ではありません
[WEAK[([[適合SGML文書]]ではありません)]]。

仕様書:
- [[JIS X 4151]]‐1992
-- 3. (104) 識別子値

[34] '''XML''':
[[XML]] の [CODE(XML)[[[ID]]]] 型の[[属性]]の値は文書内で固有でなければ'''なりません'''
([[妥当性制約]])。
この制約が満たされない XML 文書は、
[[整形式]]かもしれませんが[[妥当]]ではありません。

仕様書:
- [[XML 1.0]], [[XML 1.1]]
-- [CSECTION[Validity constraint: ID]] <IW:XML1:"id">

[35] '''HTML''':
[[HTML]] の [CODE(HTMLa)[[[id]]]] 属性と 
[CODE(HTMLa)[[[name]]]] 属性による[[識別子]]は、
同じ名前空間を共有し、文書内で固有でなければなりません。
重複は違法です。

仕様書:
- [[HTML 4]]
-- [CSECTION[7.5.2 Element identifiers: the [CODE(HTMLa)[id]] and [CODE(HTMLa)[class]] attributes]]
<IW:HTML4:"struct/global.html#id-and-class">
-- [CITE[Links in HTML documents]] 
<IW:HTML4:"struct/links.html#anchors">

[36] '''XML 情報集合''':
[[XML情報集合]]の[CODE(Infoitem)[[[属性情報項目]]]]の[CODE(infoprop)[[[参照]]]]特性は、
[CODE(Infoprop)[[[属性型]]]]が [CODE(XML)[[[IDREF]]]] や
[CODE(XML)[[[IDREFS]]]] であっても同じ[[識別子]]の複数の[[要素]]があれば、
値を持ちません。

仕様書:
- [[XML情報集合]]
-- [CSECTION[2.3. Attribute Information Items]]
<IW:Infoset:"infoitem.attribute">

[37] '''DOM''':
[[DOM]] の [CODE(DOMm)[[[getElementById]]]]
は、同じ[[識別子]]の複数の[[要素]]がある時の結果は未定義です。

仕様書:
- [[DOM水準1]]
-- HTML [CODE(DOMm)[[[getElementById]]]] メソッド
<IW:DOM1:"level-one-html.html#method-getElementById">
- [[DOM水準2]]
-- 中核 [CODE(DOMm)[[[getElementById]]]] メソッド
<IW:DOM2:"Core/core.html#ID-getElBId">
- [[DOM水準3]]
-- 中核 [CODE(DOMm)[[[getElementById]]]] メソッド
<IW:DOM3:"Core/core.html#ID-getElBId">

[38] '''XPath 1.0''':
[[XPath 1.0]] のデータ模型では、
重複する固有識別子は[[文書順]]で後の方を無視することになっています。
[[関数]] [CODE(XPathf)[[[id]]()]] はその固有識別子に基づき判断します。

仕様書:
- [[XPath 1.0]]
-- 関数 [CODE(XPathf)[[[id]]()]]
<IW:XPath1:"function-id">
-- [CSECTION[5.2.1 Unique IDs]]
<IW:XPath1:"unique-id">
-- [CSECTION[B.2. Element Nodes]]
<http://www.w3.org/1999/11/REC-xpath-19991116-errata/#element-nodes>

[39] [[DOM水準3]] [[XPath]] では、 [[XPath 1.0]]
の[[関数]]である [CODE(XPathf)[[[id]]()]] と
[[DOM]] の[[メソッド]]である [CODE(DOMm)[[[getElementById]]]]
とで同じ結果が得られなければならないと規定しています。

仕様書:
- [[DOM水準3]]
-- XPath [CSECTION[1.3 Conformance]]
<IW:DOM3:"XPath/xpath.html#Conformance">

;; [40] [[DOM3]] では [CODE(DOMm)@en[[[getElementById]]]] の結果は未定義となっていますから、
[[XPath 1.0]] の規定通りになるとは限りません。現実には、また後の [[DOM Standard]]
によれば最初の[[要素]]が返されるので、両者の返すものは一致します。

;; [[Firefox]], [[Chrome]] とも。 [TIME[2013-10-07T09:26:49.400Z]]

[41] '''XPointer''':
[[XPointer]] の[[速記]]指示子では、
[[文書順]]で最初に一致したものが採用されます。
[CODE(XPointerScheme)[[[element]] ()]] scheme
も同じ定義を採用しています。

仕様書:
- [[XPointer]] 枠組み
-- [CSECTION[3.2 Shorthand Pointer]]
<http://www.w3.org/TR/xptr-framework/#shorthand>
- [[XPointer]] [CODE(XPointerScheme)[[[element]]()]]
-- [CSECTION[3 Language and Processing]]
<http://www.w3.org/TR/xptr-element/#model>

[42] '''CSS''':
[[CSS]] の ID [[選択子]]は[[マーク付け言語]]における文書内の固有な識別子で使われることが想定されています。
重複に関する規定はありません。

仕様書:
- [[CSS 1]]
-- [CSECTION[1.5    ID as selector]]
<IW:CSS1:"id-as-selector">
- [[CSS 2]]
-- [CSECTION[5.9 ID selectors]]
<IW:CSS2:"selector.html#id-selectors">

[43] [CITE@en[Re: Selectors API: Multiple elements with the same ID from Boris Zbarsky on 2007-01-28 (public-webapi@w3.org from January 2007)]] ([[Boris Zbarsky (bzbarsky@mit.edu)]] 著, [TIME[2007-01-28 13:54:06 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-webapi/2007Jan/0158>

** DOM Standard

[21] [CITE[Handle setting id to the empty string https://www.w3.org/Bugs/Public/sho... · 967552c · whatwg/dom]]
( ([TIME[2014-05-16 08:32:42 +09:00]] 版))
<https://github.com/whatwg/dom/commit/967552c81e1912a6ace72050a3a68a257c1ff672>


[FIG(quote)[
[FIGCAPTION[
[44] [CITE@en[RFC 3340 - The Application Exchange Core]]
([TIME[2016-02-21 19:44:34 +09:00]] 版)
<https://tools.ietf.org/html/rfc3340>
]FIGCAPTION]

>    <!ELEMENT data-content
>                          ANY>
>    <!ATTLIST Name        ID                #REQUIRED>

]FIG]
