[6] [DFN[[RUBYB[[[外来マーク付け]]]@en[foreign markup]]]]は、
[[Atom]] において [[Atom]] 以外の[[マーク付け]]を指します。

* 仕様書

[REFS[
-[5] '''[CITE@en[RFC 4287 - The Atom Syndication Format]] ([TIME[2009-08-20 17:27:51 +09:00]] 版) <http://tools.ietf.org/html/rfc4287#section-6>'''
- [2]
[CITE@en[RFC 5023 - The Atom Publishing Protocol]] ([TIME[2008-11-20 18:52:14 +09:00]] 版) <http://tools.ietf.org/html/rfc5023>
- [23] [CITE@en[RFC 6721 - The Atom "deleted-entry" Element]] ([TIME[2012-12-31 01:08:20 +09:00]] 版) <http://tools.ietf.org/html/rfc6721#page-4>
- [43] [CITE[I-D/Published/atom-format/draft-nottingham-atom-format-02.xml at master · mnot/I-D]] ([TIME[2014-03-23 02:38:41 +09:00]] 版) <https://github.com/mnot/I-D/blob/master/Published/atom-format/draft-nottingham-atom-format-02.xml#L494>
]REFS]

* 文書の要件

[7] [[Atom文書]]は[[外来マーク付け]]を含めることができます。特に
[CODE(XMLe)@en[[[atom:content]]]] [[要素]]は任意の[[外来マーク付け]]を含められるようになっています。
[SRC[[[RFC 4287]] 6.1.]]

[1] [[AtomPub文書]]中の認識できない[[マーク付け]]は [[Atom 1.0]]
の[[外来マーク付け]]とみなします。[[外来マーク付け]]は、
[[分類文書]]と[[サービス文書]]の中の明示的に禁じられていない任意の場所で用いることができます。
[SRC@en[[[AtomPub]]]]

[24] [CODE(XMLe)@en[[[at:deleted-entry]]]] [[要素]]の仕様ではなぜか[[外来マーク付け]]の定義を引用せずに、
独自に同様の規定を持っています。 [[RELAX NG]] [[スキーマ]]上では [DFN[[CODE[[[anyElement]]]]]]
とされているものがそれに相当する模様です。 [CODE(XMLe)@en[[[at:deleted-entry]]]]
[[要素]]内では任意の[[要素]]と[[属性]]を使うことができます [SRC[>>23]]。

[33] >>4 の通り[[Atom名前空間]]などの未定義の[[要素]]や[[属性]]も[[外来マーク付け]]として処理されるようですが、
[[文書]]の適合性に関して任意の[[要素]]や[[属性]]が認められると解釈していいものかどうかは不明です。
将来の拡張を仕様違反としない意図があるのかもしれませんが、そのような場合は仕様を改訂すれば良いはずです。
仮に仕様違反でないと解釈すると、[[文書]]の[[適合性]]に意味があまりなくなってしまいます。

[35] [[テキスト]]のみと認めると思われる[[要素]]の[[内容]]として[[要素]]を含められるか否かについて、
ほとんどの箇所で明記されていません。 [[RELAX NG]] [[スキーマ]] ([[参考]]) としては認めていないことになっていますが、
[[規定]]として禁止されていません。

[44] [[Atom 0.3]] の [CODE(XMLe)@en[[[atom:feed]]]] [[要素]]と [CODE(XMLe)@en[[[atom:entry]]]]
[[要素]]も、任意の[[名前空間]]の[[要素]]を[[子供]]として[['''構わない''']]とされていました
[SRC[>>43]]。

* 処理モデル

[9] [[Atom処理器]]は、[[外来マーク付け]]が認められている場所で[[外来マーク付け]]を見つけても処理を停止しては[['''なりません''']]し、[[誤り]]を通知しては[['''なりません''']]。
[SRC@en[[[RFC 4287]] 6.3.]]

[3]
[[処理器]]は、[[外来マーク付け]]で処理を停止しては[['''なりません''']]し、[[誤り]]を通知しては[['''なりません''']]。
[SRC@en[[[AtomPub]], >>23]]

[10] [[Atom処理器]]は[[外来マーク付け]]を処理できるかもしれませんが、処理できないものは[DFN[[RUBYB[未知外来マーク付け]@en[unknown foreign markup]]]]といいます。
[SRC@en[[[RFC 4287]] 6.3.]]

[11] [CODE(XMLe)@en[[[atom:entry]]]] [[要素]]、 [CODE(XMLe)@en[[[atom:feed]]]]
[[要素]]、[[Person construct]] の[[子要素]]の[[未知外来マーク付け]]、
[CODE(XMLe)@en[[[at:deleted-entry]]]] [[要素]]の[[子要素]]の[[未知外来マーク付け]]に関しては、
それらおよびその[RUBYB[[[文字内容]]]@en[textual content]]を読み飛ばして[['''構わず''']]、
[[マーク付け]]があるからといって動作を変更しては[['''なりません''']]。
[SRC@en[[[RFC 4287]] 6.3., >>23]]

[12] [CODE(XMLe)@en[[[atom:content]]]] [[要素]]や [[Text construct]]
で[[未知外来マーク付け]]があったときは、その[[マーク付け]]を無視してその[RUBYB[[[文字内容]]]@en[textual content]]だけがあったかのように処理する[['''べきです''']]。
[SRC@en[[[RFC 4287]] 6.3.]]

[8] 
[[クライアント]]は[[文書]]の[[転送]]にあたって[[外来マーク付け]]を保持する[['''べきです''']]。
[SRC@en[[[AtomPub]]]]

[4] [CODE(URI)@en[[[http://www.w3.org/2005/Atom]]]] [[名前空間]]、
[CODE(URI)@en[[[http://www.w3.org/2007/app]]]] [[名前空間]]は将来の拡張のために予約されていますが、
この[[名前空間]]の[[要素]]や[[属性]]であっても、
認識できない[[マーク付け]]は[[外来マーク付け]]として扱わなければ[['''なりません''']]
[SRC@en[[[RFC 4287]] 6.2.、[[AtomPub]]]]。

[32] [CODE(URI)@en[[[http://purl.org/syndication/history/1.0]]]] [[名前空間]]については、
[[外来マーク付け]]に相当するものを含め、仕様に含まれないものをどう処理するべきか言及すらされていません。

* 拡張要素

[13] [[外部マーク付け]]は、特に禁じられている箇所以外の
[[Atom文書]]のあらゆるところで認められていますが、
[[意味]]が定義されているのは >>14 の場合だけで、それ以外の[[外部マーク付け]]の[[役割]]は未定義となっています。
[SRC[[[RFC 4287]] 6.4.]]

[14] [CODE(XMLe)@en[[[atom:feed]]]]、[CODE(XMLe)@en[[[atom:entry]]]]、
[CODE(XMLe)@en[[[atom:source]]]]、[[Person construct]] の各[[要素]]の[[子要素]]は
[[Metadata要素]]であり、[[単純拡張要素]]または[[構造化拡張要素]]です。
[SRC[[[RFC 4287]] 6.4.]]

[15] [[RELAX NG]] [[スキーマ]] ([[参考]]) によると[[単純拡張要素]]と[[構造化拡張要素]]の総称が
[DFN[[CODE(XML)@en[[[extensionElement]]]]]] です。 [SRC[[[RFC 4287]] 6.4.]]
([[規定]]の部分では「[RUBYB[[[拡張要素]]]@en[extension element]]」の定義は明記されていません。)

[34] [CODE(XMLe)@en[[[app:service]]]] [[要素]]は [[RELAX NG]] [[スキーマ]] ([[参考]]) では
[CODE@en[[[extensionElement]]]] を[[内容]]に持っています [SRC[>>2]] が、
仕様書本文で[[拡張要素]]を認めるとはされていません。

[30] [CODE(XMLe)@en[[[app:control]]]] [[要素]]も[[拡張要素]]を含めることができます [SRC[>>2]]。
[[RELAX NG]] [[スキーマ]] ([[参考]]) でも [CODE@en[[[extensionElement]]]] を認めています。

[38] [[Atom]] 本体では [[Atom名前空間]]、[[AtomPub]] では [[AtomPub名前空間]]の[[要素]]を除く[[要素]]が
[CODE@en[[[extensionElement]]]] に含まれています。

[37] [[RELAX NG]] [[スキーマ]] ([[参考]]) によると [CODE(XMLe)@en[[[app:workspace]]]] と
[CODE(XMLe)@en[[[app:collection]]]] の[[内容]]として [CODE(XMLe)@en[[[extensionSansTitleElement]]]]
を認めており、これは [CODE(XMLe)@en[[[atom:title]]]] と [[AtomPub]] [[要素]]を除く[[拡張要素]]を表しています [SRC[>>2]]。
ただし仕様書本文で[[拡張要素]]を認めるとはされていません。

;; [39] [CODE(XMLe)@en[[[atom:title]]]] [[要素]]はこれらの[[要素]]の[[子要素]]として使えることになっているので、
[[拡張要素]]からは除外されているようです。

[42] >>24 の通りなぜか明記されていませんが、 [CODE(XMLe)@en[[[at:deleted-entry]]]] [[要素]]も[[拡張要素]]が使えるものとして扱うのが自然と思われます。

[25] [[単純拡張要素]]と[[構造化拡張要素]]の違いは、[[子要素]]や[[属性]]があるか否かだけです。従って
[[Atom]] 以外の[[名前空間]]の任意の[[要素]]が[[拡張要素]]たり得ます。
特定の[[要素]]が文脈によって[[単純拡張要素]]だったり[[構造化拡張要素]]だったりできるのかは明記されていませんが、
現時点では [[Atom]] 関連仕様でそのような例はないようです。

** 単純拡張要素

*** 意味

[18] [DFN[[RUBYB[[[単純拡張要素]]]@en[Simple Extension element]]]]は、
それが含まれる[[親要素]]の1つの[[特性]] ([[名前]]・[[値]]の組)
を表します。[[要素]]の[[名前空間URL]]と[[局所名]]の組が[[特性]]の[[名前]]となります。
[[要素]]の[[文字データ]][[内容]]が[[特性]]の値となります。
[[要素]]が[[空]]の場合、[[特性]]の値は[[空文字列]]です。
[SRC[[[RFC 4287]] 6.4.1.]]

*** 構文

[16] [[単純拡張要素]]には、[[属性]]や[[子要素]]があっては[['''なりません''']]。
[[文字データ]]を含んでも[['''構いません''']]し、
[[空]]であっても[['''構いません''']]。
[[Language-Sensitive]] ではありません。
[SRC[[[RFC 4287]] 6.4.1.]]

[17] [[RELAX NG]] [[スキーマ]]上の名称は [CODE(XML)@en[[[simpleExtensionElement]]]]
であり、[[データ型]]は [CODE(XML)@en[[[text]]]] です。
[SRC[[[RFC 4287]] 6.4.1.]]

** 構造化拡張要素

*** 意味

[21] [DFN[[RUBYB[構造化拡張要素]@en[Structured Extension element]]]]の構造は、
[[子要素]]の順序も含み、意味を持つかもしれません。
[SRC[[[RFC 4287]] 6.4.2.]]

[22] [[Atom]] では[[構造化拡張要素]]の解釈を定義しておらず、
[[要素]]内の[[構文]]やその解釈は [[Atom]] 拡張の仕様書によって定義されます。
[SRC[[[RFC 4287]] 6.4.2.]]

*** 構文

[19] [[構造化拡張要素]]の[[根要素]]は、最低1つ、[[属性]]か[[子要素]]を持たなければ[['''なりません''']]。
[[構造化拡張要素]]は [[Language-Sensitive]] です。
[SRC[[[RFC 4287]] 6.4.2.]]

;; [41] [[Language-Sensitive]] であるというよりあり得るというほうが実態には近いのでしょう。実際 >>28
を見るといずれもそれ自体は [[Language-Sensitive]] である意味がないように見えます。

[20] [[RELAX NG]] [[スキーマ]] ([[参考]]) 上の[[名前]]は 
[CODE(XML)@en[[[structuredExtensionElement]]]] です。
[SRC[[[RFC 4287]] 6.4.2.]]

* 拡張要素の一覧

[26] [[単純拡張要素]]には次のものがあります。
[FIG[
- [CODE(XMLe)@en[[[fh:archive]]]]
- [CODE(XMLe)@en[[[fh:complete]]]]
- [CODE(XMLe)@en[[[thr:total]]]]
- [CODE(XMLe)@en[[[app:edited]]]]
]FIG]

;; [27] [CODE(XMLe)@en[[[fh:archive]]]], [CODE(XMLe)@en[[[fh:complete]]]],
[CODE(XMLe)@en[[[app:edited]]]] は[[拡張要素]]とは明記されていませんが、
構造上、[[単純拡張要素]]となっています。

[28] [[構造化拡張要素]]には次のものがあります。
[FIG[
- [CODE(XMLe)@en[[[thr:in-reply-to]]]]
- [CODE(XMLe)@en[[[app:control]]]]
- [CODE(XMLe)@en[[[at:deleted-entry]]]]
]FIG]

;; [29] [CODE(XMLe)@en[[[thr:in-reply-to]]]], [CODE(XMLe)@en[[[thr:total]]]],
[CODE(XMLe)@en[[[at:deleted-entry]]]]
が[[単純拡張要素]]か[[構造化拡張要素]]は [[Atom]] 関連仕様では明記されておらず、ただ単に[[拡張要素]]とされていますが、
どちらであるかは構造上自明です。

[40] [[Atom名前空間]]の[[要素]]も、 [[AtomPub]] から見ると[[拡張要素]]に当たるようですが、
>>26、>>28 では省略しています。

* 空要素

[36] [[Atom]] および関連仕様には[[空要素]]とみられるもの、[[空要素]]とされているものがありますが、
[[RELAX NG]] [[スキーマ]] ([[参考]]) としては [CODE@en[[[undefinedContent]]]]
とされていることがほとんどであり、また[[要素]]の[[内容]]は未定義とされていることが多いです。
>>13 の通り[[外来マーク付け]]が認められているようですが、その意味は定義されていません。

[45] [CITE@en[RFC 5854 - The Metalink Download Description Format]]
( ([TIME[2014-09-14 16:54:14 +09:00]] 版))
<http://tools.ietf.org/html/rfc5854#section-5.3>