[3] [DFN[[[URI Template]]]] は、 [[IETF]] の
[DFN[[[RFC 6570]]]] で規定されている[[URL雛形]]構文の一種です。

* 仕様書

[REFS[
- [34] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570>
-- [17] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570#section-1.1>
-- [40] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570#section-1.6>
-- [45] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570#section-2>
-- [47] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570#section-3>
-- [68] [CITE@en[RFC 6570 - URI Template]] ([TIME[2014-10-27 23:08:55 +09:00]] 版) <http://tools.ietf.org/html/rfc6570#appendix-A>
- [35] [CITE[RFC Errata Report]] ([TIME[2015-01-17 15:19:44 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=6570>
]REFS]

* 言語

[36] 次の概念が存在します。
[FIG(short list)[
- [[URI雛形]]
- [[雛形リテラル][雛形リテラル (URI雛形)]]
- [[雛形式]]
- [[式型]]
- [[演算子]]
- [[変数]]
- [[値修飾子]]
- [[展開]]
- [[雛形処理器]]
- [[水準 (URI雛形)]]
]FIG]

[38] 入力となる[[雛形]]は、 [[絶対URL]]相当のものであることもあれば、
[[相対URL]]相当のものであることもあります。[[解決]]は、
[[展開]]より後に行います [SRC[>>17]]。

;; [[展開]]の前に[[解決]]を適用してしまうと、結果が変わってしまうことがあります。

[44] [[URI Template]] は、0個以上の[[リテラル]]や[[式]]の列です [SRC[>>45]]。
[FIG(railroad)[
= *
== |
=== [[雛形リテラル][雛形リテラル (URI雛形)]]
=== [[雛形式]]
]FIG]

[41] [[URI Template]] は、 [[Unicode符号位置]]の列です [SRC[>>40]]。

;; [42] [[RFC 3986]] [[URI]] とは違って、 [[ASCII文字]]に限定はされていません。

* 展開

[48] [[URI雛形]]から [[RFC 3986]] [[URI参照]]を得る[[演算]]を[DFN[[RUBYB[[[展開]]]@en[expansion]]]]といいます。
また[[演算式]]を処理して得られる[[文字列]]のことも[DFN[[RUBYB[[[展開]]]@en[expansion]]]]
[SRC[>>17]] と呼ばれています。

[49] [[URI雛形]]の[[展開]]は、次のように行います。
[FIG(steps)[
= [50] 入力として[[雛形]]と、[[変数]]の値を用意します [SRC[>>47]]。
= [51] 出力として結果を空文字列、誤りを null とします。
= [52] [[雛形]]を最初から順に[[走査]]してゆきます [SRC[>>47]]。
== [53] [[雛形リテラル][雛形リテラル (URI雛形)]]なら、[[展開]]し、結果の末尾に連結します [SRC[>>47]]。
== [54] [CODE[[[{]]]] ... [CODE[[[}]]]] [SRC[>>68]] なら、
=== [55] [[雛形式]]として[[展開]]を試みます [SRC[>>47]]。
=== [56] 成功したら、結果の末尾に[[展開]]結果を連結します [SRC[>>47]]。
=== [57] 失敗したら、
==== [58] 誤りの位置と種類を設定する[['''べきです''']] [SRC[>>47]]。
==== [59] [[展開]]しないまま結果の末尾に連結する[['''べきです''']] [SRC[>>47]]。
== [60] [[文法]]に一致しない文字列 (対応する [CODE[[[}]]]] のない [CODE[[[{]]]] や、
[[雛形リテラル]]以外の[[文字]] [SRC[>>68]]) なら、
=== [61] 誤りの位置と種別を設定する[['''べきです''']]。 [SRC[>>47]]
=== [62] この部分以降の[[雛形]]残りすべてをそのまま結果の末尾に連結し、
>>64 に進む[['''べきです''']] [SRC[>>47]]。
== [63] [[雛形]]の最後に到達したら、 >>64 に進みます。そうでなければ、 >>52 に戻ります。
= [64] 出力として結果と誤りを返します。
]FIG]

;; [65] [[雛形リテラル][雛形リテラル (URI雛形)]]、[[雛形式]]の展開の項も参照。

[43] [[利用者]]によって与えられた値は、 [[NFC]] に[[正規化]]する[['''べきです''']]
[SRC[>>40]]。

;; [46] それ以外の場合について特に制約はありません。従って出力が [[NFC]]
である保証もありません。

[37] 出力は、 [[RFC 3986]] [[URI参照]]です [SRC[>>34]]。

[66] [[誤り]]がある場合、得られた文字列は妥当な [[URI参照]]ではないかもしれません。
これは診断用のものです。 [SRC[>>47]]

[67] [[誤り]]が無い場合、[[RFC 3986]] [[URI参照]]で使うことができない[[文字]]が含まれないことは保証されます。
構文的・意味的に正しいことは保証されません。

* 応用

[6]
[[WADL]] [CODE(XMLa)@en[[[pattern]]]] [[属性]]: >>3 系の構文

[8]
[[AtomPP]] は以前 >>3 系の構文で [[URI雛形]] (or [[IRI雛形]]) を使っていましたが、既に削除されています。

;; [CITE[ietf-atompub-protocol]] <http://ietfreport.isoc.org/idref/draft-ietf-atompub-protocol/>

[REFS[
- [32] [CITE[Restlet | Technical Resources | Framework]] ([TIME[2015-01-17 15:14:29 +09:00]] 版) <http://restlet.com/technical-resources/restlet-framework/tutorials#part11>
-- [11]
[CITE[Restlet - Tutorial]] ([TIME[2007-01-09 21:53:39 +09:00]] 版) <http://www.restlet.org/tutorial#part11>
-- [33] >>11 は [CODE(HTTP)[[[404]]]] [TIME[2015-01-17T06:15:08.00Z]]
]REFS]

[21] [CITE@en[draft-hammer-hostmeta-13 - Web Host Metadata]]
( ([TIME[2010-09-16 05:16:02 +09:00]] 版))
<http://tools.ietf.org/html/draft-hammer-hostmeta>

* 関連

[1] 
同じ目的の他の構文は、 [[URL雛形]]を参照。


* 歴史

[39] [[URI Template]] は [[WSDL]]、[[WADL]]、[[OpenSearch]] などの既存の雛形構文を統合し拡張して[[インターネット]][[応用]]での共通の構文とする [SRC[>>34]] ことを謳っています。
しかし実際には [[OpenSearch]] の構文と互換性があるのは[[水準1]]だけで、
[[OpenSearch]] の省略可能構文に [[URI Template]] は対応していません。

[7]
[CITE[gregorio-uritemplate]] <http://ietfreport.isoc.org/idref/draft-gregorio-uritemplate/>

[16]
[CITE[mnot’s Web log: URI Templates Redux]] ([TIME[2007-07-28 13:11:02 +09:00]] 版) <http://www.mnot.net/blog/2007/07/28/more_uri_templates>
([[名無しさん]] [WEAK[2007-07-28 13:19:06 +00:00]])

[18]
[CITE@en-US[snellspace.com &#187; Blog Archive &#187; URI Template Update]] ([TIME[2007-08-15 13:20:27 +09:00]] 版) <http://www.snellspace.com/wp/?p=717>

* 実装

[9]
[CITE[Joe Gregorio | BitWorking | Projects | URI-Templates]] <http://bitworking.org/projects/URI-Templates/>

[14]
[CITE[Brian Cassidy / URI-Template - search.cpan.org]] ([CODE[2007-02-18 15:08:51 +09:00]] 版) <http://search.cpan.org/dist/URI-Template/>
([[名無しさん]] [WEAK[2007-02-18 06:10:45 +00:00]])

[19] [CITE[URI::Template 0.14_01 は draft-03 相当 - Yet Another Hackadelic]] ([TIME[2009-02-01 19:35:28 +09:00]] 版) <http://d.hatena.ne.jp/ZIGOROu/20081211/1229008879>

[20] [CITE[URI Templates の各言語実装 - Mi manca qualche giovedi`?]] ([TIME[2009-02-01 19:35:13 +09:00]] 版) <http://d.hatena.ne.jp/n_shuyo/20080614/uritemplates>

[22] [CITE[uri-templates - URI Template Library - Google Project Hosting]]
( ([TIME[2011-06-11 15:17:56 +09:00]] 版))
<http://code.google.com/p/uri-templates/>

[70] [[wlwmanifest]] も[[水準1]]のようなものを使っているようです。

[71] [CITE@en[Schema.org Actions - schema.org]]
( ([TIME[2015-02-12 17:09:35 +09:00]] 版))
<http://schema.org/docs/actions.html>

[73] [CITE@en[draft-wilde-template-desc-00 - URI Template Descriptions]]
([TIME[2015-01-25 14:15:21 +09:00]] 版)
<https://tools.ietf.org/html/draft-wilde-template-desc-00>


* メモ

[69] [[水準1]]だけにとどめておけばよかったものを、欲を出して拡張したせいで必要以上に複雑なものになってしまった印象があります。
