[13] [DFN[[RUBYB[文書順]@en[document order]]]]は、 [[DOM]] や [[XDM]] における[[節点]]の[[順序関係]]です。
[[文書順]]では、 [[XML]] による文字列表現において、当該[[節点]]を表す最初の[[文字]]の位置の前後が順序の前後となります。

[19] [[XML]] や [[W3C DOM]] の時代によく用いられていた用語ですが、
現在ではあまり用いられていません。似た意味の用語に[[木順]]があり、
こちらが一般的となっています。

* 仕様書

[5] 「[[文書順]]」という用語は複数の仕様書がそれぞれ定義しています。
[[データ・モデル]]の違いが微妙に定義の違いとなっていますが、実質的な意味はほぼ同じです。

- [10] [[XPath 1.0]]
-- <http://www.w3.org/TR/xpath#dt-document-order>
- [11] [[XSLT 1.0]]
-- <http://www.w3.org/TR/xslt#function-document>
- [37] [[DOM3]]
-- [9] <http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order>
--- <http://www.w3.org/TR/DOM-Level-3-XPath/glossary.html#dt-document-order> も同じ内容
-- [36] <http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#DocumentOrder>
- [30] [[XML情報集合]]
-- <http://www.w3.org/TR/xml-infoset/#infoitem.doctype>
- [12] [[正準XML]]
-- [CSECTION[2.2 Document Order]]
<http://www.w3.org/TR/2001/REC-xml-c14n-20010315#DocumentOrder>
- [42] [[XDM]]
-- <http://www.w3.org/TR/xpath-datamodel/#document-order>
--- [53] [CITE@EN[XQuery 1.0: An XML Query Language (Second Edition)]] ([TIME[2011-01-05 01:29:08 +09:00]] 版) <http://www.w3.org/TR/2010/REC-xquery-20101214/#id-document-order>
--- [54] [CITE@EN[XML Path Language (XPath) 2.0 (Second Edition)]] ([TIME[2011-01-05 01:25:51 +09:00]] 版) <http://www.w3.org/TR/2010/REC-xpath20-20101214/#id-document-order>
---- 同じもののコピー

* 基本的な定義

** DOM、XPath 1.0 データ・モデルにおける定義

[1] 
> There is an ordering, document order, defined on all the nodes in the document corresponding to the order in which the first character of the XML representation of each node occurs in the XML representation of the document after expansion of general entities.

[DFN[文書順]]は、[[文書]]中のすべての[[節点]]に関して定義される[[順序]]であり、
[[文書]]の[[XML]]表現で[[一般実体]]を[[展開]]した後の各[[節点]]の[[XML]]表現の最初の[[文字]]の[[順序]]に対応します。 [SRC[>>10 (XPath 1.0), >>9 (DOM)]]

** XDM における定義

[43] [[XDM]] での定義 [SRC[>>42]] は、実質的には [[XPath 1.0データ・モデル]]での定義と同じですが、
[[XML]] 表現による定義を「[RUBYB[非形式的]@en[informal]]」なものとして紹介した上で、 >>15
などのような満たすべき制約を述べて規定とする形に変わっています。

;; 後述のように[[木]]に対してではなく[[木]]の集合に対する定義になっているところは違います。

** XML 情報集合における定義

[6]
[[XML情報集合]]仕様書でも文書順を定義に使っていますが、
その「文書順」という用語の定義がありません。

* 属性の文書順

** DOM、XPath 1.0 データ・モデルにおける定義

[23] [[XPath 1.0データ・モデル]]では[[属性節点]]の他に[[名前空間節点]]があります。
どちらも [[XML]] の[[開始タグ]]の[[属性]]に相当するとみなされ、
[[要素]]自体よりは後、[[子供]]よりは前になります。

[38] [[DOM]] 本体には[[名前空間節点]]が存在しないので、その部分の定義は省略されていますが、
[[DOM XPath]] で[[名前空間節点]]が導入されており、 [[XPath 1.0]] 同等の定義に拡張されています。

[18] 
> The namespace nodes are defined to occur before the attribute nodes.

[[名前空間節点]]は[[属性節点]]の前に出現すると定義します。 [SRC[>>10 (XPath 1.0), >>36 (DOM XPath)]]

[22] 
> The relative order of namespace nodes is implementation-dependent.
The relative order of attribute nodes is implementation-dependent.

[[名前空間節点]]の相対順序は[[実装依存]]です。 [SRC[>>10 (XPath 1.0), >>36 (DOM XPath)]]
[[属性節点]]の相対順序は[[実装依存]]です。 [SRC[>>10 (XPath 1.0), >>9 (DOM)]]

[28] この「[[実装依存]]」について、順序が同じ実装内では一貫していなければならない、
といった類の規定がありません。ランダムでもいいということでしょうか。

[46] [[XDM]] の定義では順序は[[安定]]でなければならないとされています [SRC[>>42]]。

;; [50] [CODE(DOMm)@en[[[compareDocumentPosition]]]] [[メソッド]]の動作は「[[文書順]]」
の定義によらずに独自に定義されていますが、そちらでは多少明確に「[[安定]]」
でなければならないことが規定されています。

** 正準 XML における定義

[24] [[正準XML]] は [[XPath 1.0データ・モデル]]に基づいていますが、
[[名前空間節点]]と[[属性節点]]の順序を規定しています。

[4] [[正準XML]] においては、名前空間節点の文書順は[[局所名]]の[[辞書式順序]]になります。
ただし、[[既定名前空間]]の宣言 [WEAK[([[修飾名]]が [CODE(XML)[[[xmlns]]]])]]
は一番先になります。

属性節点の文書順は、最初に[[名前空間URI]]、2番目に[[局所名]]を使った[[辞書式順序]]になります。
ただし、[[null名前空間]]は一番最初になります。

ここで、辞書式順序とは [[UCS]] の[[符号位置]]の順序になります。
[SRC[C14N, 2.2]]

* 文書型宣言内の文書順

[29] [[XPathデータ・モデル]]でも [[DOM]] でも、「[[一般実体]]を展開した後」とは言っていますが、
[[引数実体]]には触れられていません。 [[XPathデータ・モデル]]は[[引数実体]]の位置に依存する[[節点]]はありませんが、
[[DOM]]や[[XML情報集合]]には存在します。

[7]
[[XML情報集合]]では、[CODE(infoitem)[[[処理指令]]情報項目]]の[CODE(infoprop)[[[子供]]]]特性では[[内部部分集合]]が[[外部部分集合]]より前ということが特に規定されています。 [SRC[>>30]]
[[引数実体]]については触れられていません。

;; [31] 実はこの箇所は「original document order」といっていて、用語としての「文書順」なのか
一般名詞として「元の文書の順序」と述べているに過ぎないのか不明瞭です。

;; [51] [CODE(DOMm)@en[[[compareDocumentPosition]]]] [[メソッド]]の動作は「[[文書順]]」
の定義によらずに独自に定義されていて、[[XML]] 表現によらずに [[DOM]]
構造上の位置によって決まることになっています。

* 実体参照の文書順

[40] [[DOM]] には [CODE(DOMi)@en[[[EntityReference]]]] [[節点]]が存在することになっていますが、
>>1 の規定が「[[一般実体]]を[[展開]]した後」とされているため、展開されて消滅するであろう
[CODE(DOMi)@en[[[EntityReference]]]] [[節点]]の順序は厳密には不明瞭です。

;; [49] [CODE(DOMm)@en[[[compareDocumentPosition]]]] [[メソッド]]の動作は「[[文書順]]」
の定義によらずに独自に定義されていて、この問題を回避しています。
その動作によれば、[[実体参照節点]]でない他の[[節点]]であった場合と同じような順序を持ちます。

* 文書外の節点の文書順

[41] [[DOM]] で[[文書]]に[[挿入]]されていない[[節点]]であったり、 [CODE(DOMi)@en[[[DocumentFragment]]]]
[[節点]]であったり、 [[XSLT 1.0]] の[[結果木素片]]であったりと、
[[文書]]に所属していない[[節点]]が存在することがあります。
厳密には、これらに対する「[[XML]] 表現」が何であるのかがどこでも定義されていないので、
[[文書順]]の定義も明確ではありません。また、
このような[[部分木]]を超えた[[文書順]]の定義も明確にされていません。

[44] [[XDM]] における定義では、[[木]]同士に[[実装依存]]の順序があり、
そのなかで各[[節点]]の順序があるとされています。 [SRC[>>42]]

;; [50] [CODE(DOMm)@en[[[compareDocumentPosition]]]] [[メソッド]]の動作は「[[文書順]]」
の定義によらずに独自に定義されていますが、そちらでは明示的に[[実装規定]]となっています。

* 文書を超えた文書順

[25] [[XSLT 1.0]] は [[XPath 1.0データ・モデル]]に基づいていますが、
[CODE(XPathf)@en[[[document()]]]] [[関数]]によって異なる[[文書]]の[[節点]]が混在することがあるので、
[[文書]]を超えた[[文書順]]を定めています。

[26] 異なる[[文書]]の[[節点]]の順序は、それぞれの[[文書]]の順序によって決定します [SRC[>>11]]。

[2] [[文書]]の順序は[[実装依存]]です。ただし、その順序は当該実装の中では一貫していなければなりません。
[SRC[>>11]]

[3] >>2 文書が同じであるとは、その (絶対) [[URI]] ([[素片識別子]]を取り除いたもの。) 
が同じであることです [SRC[XSLT 1.0]]。どの程度同じなら同じかは触れられていません。 
(URI の[[正規化]]をするのかしないのか。。。)

[27] >>2 この一貫性というのがどの程度維持されていなければならないかについて、
[[XSLT 1.0]] は「同じ文書の集合については必ず同じ順序を使わなければならない」
としていますが、この規定はそれほど明確ではありません。
別の[[XSLTスタイル・シート]]を処理する時にも同じ文書の集合が対象だったら同じ順序でなければならないのでしょうか
(これはきっとそうであることを意図しているのでしょう)。
同じ[[XSLTスタイル・シート]]を処理するときに別の[[プロセス]]であっても同じ順序でなければならないのでしょうか。
対象となる[[文書]]が編集されたとしたら、その前と同じ順序を維持しなければならないのでしょうか
[WEAK[(「実装依存」の方法が「ファイルの編集時刻に依存して順序を決定する」とするなら、そうであっても規定の範囲内にはなりますね)]]。

[45] [[XDM]] における定義では、[[木]]同士に[[実装依存]]の順序があり、
そのなかで各[[節点]]の順序があるとされています。 [SRC[>>42]]

;; [48] [CODE(DOMm)@en[[[compareDocumentPosition]]]] [[メソッド]]の動作は「[[文書順]]」
の定義によらずに独自に定義されていますが、そちらでは明示的に[[実装規定]]となっています。
更に、異なる [[DOM]] 実装の[[節点]]同士の比較についても言及があります。

* 系

- [15] [[根節点]]は最初の[[節点]]となります [SRC[>>10]]。 
-- [32] [[DOM]] には「[[文書要素節点]]が最初の[[節点]]」とありますが [SRC[>>9]]、正しくは「[[文書節点]]」です。
- [16] [[要素節点]]はその[[子供]]よりも前となります [SRC[>>10, >>9]]。
- [17] [[要素節点]]は[[開始タグ]]の順序となります [SRC[>>10, >>9]]。
- [5] とある[[要素節点]]に関係する[[節点]]は、 [[名前空間節点]] → [[属性節点]] → [[子供]]である[[要素節点]]の順序となります [SRC[>>10, >>9, >>36]]。

* 関連

[14] [[文書順]]の逆の[[逆文書順]]もあります。

[39] [[DOM]] には[[文書順]]を比較する [CODE(DOMm)@en[[[compareDocumentPosition]]]]
[[メソッド]]があります。

[47] [[Web Applications 1.0]] では[[文書順]]に似た「[[木順]]」という[[順序関係]]が定義されています。

[52] [[IE]] には[[文書順]]に似た「[[ソース順]]」に基づく [CODE(DOMa)@en[[[sourceIndex]]]]
[[属性]]があります。

* メモ

[8]
[CITE[IT戦記 - ノードの集合を「ドキュメント順」に高速に並べ替える。その1]] ([CODE[2007-09-04 22:12:32 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20070903/1188844070>


[55] [CITE@EN[XQuery 3.0: An XML Query Language]]
( ([TIME[2014-04-08 08:26:21 +09:00]] 版))
<http://www.w3.org/TR/xquery-30/#id-document-order>

[56] [CITE@EN[XML Path Language (XPath) 3.0]]
( ([TIME[2014-04-08 07:58:50 +09:00]] 版))
<http://www.w3.org/TR/xpath-30/#id-document-order>

[57] [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/#document-order>

[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[RFC 7950 - The YANG 1.1 Data Modeling Language]]
([TIME[2016-09-15 03:32:37 +09:00]])
<https://tools.ietf.org/html/rfc7950#section-6.4>
]FIGCAPTION]

> The data tree has no concept of document order.  An implementation
>    needs to choose some document order, but how it is done is an
>    implementation decision.  This means that XPath expressions in YANG
>    modules SHOULD NOT rely on any specific document order.

]FIG]


[21] [CITE@EN[XQuery 3.1: An XML Query Language]]
([TIME[2017-03-20 09:23:33 +09:00]])
<https://www.w3.org/TR/2017/REC-xquery-31-20170321/#id-document-order>

[33] [CITE@EN[XML Path Language (XPath) 3.1]]
([TIME[2017-03-20 09:18:04 +09:00]])
<https://www.w3.org/TR/2017/REC-xpath-31-20170321/#id-document-order>

[34] [CITE@en[XQuery and XPath Data Model 3.1]]
([TIME[2017-03-20 07:26:25 +09:00]])
<https://www.w3.org/TR/2017/REC-xpath-datamodel-31-20170321/#dt-document-order>

[35] [CITE@en['''['''css-display-3''']''' Define “document order” since we use it in many place…]]
([[fantasai]]著, [TIME[2018-03-07 00:10:20 +09:00]])
<https://github.com/w3c/csswg-drafts/commit/c2d98a3c518b47ad73e653b707a7d8e8d7f8d3c3>