タグはスカラー、シーケンス、マッピングのそれぞれのノードにデータ型を指定します。一つのノードにタグ・プロパティを一つ指定でき、ノードに指定できるデータ型は一つだけに限定されています。
タグにはグローバル・タグとローカル・タグの2種類があり、前者は URI、後者はシンボルです。タグをどのようなデータ型へ当てはめるかは YAML ストリームとは別に定義されているだろうスキーマの存在を仮定しています。スキーマといっても、仕様とワンセットで定義されている JSON スキーマや YAML スキーマは人間向けの説明が記入されている HTML ページにすぎません。これらのスキーマのページは WWW 内から URL で参照できるようになっています。一方、タグには tag URI scheme RFC 4151 の利用が推奨されており、タグの URI とスキーマページの URL の関係は機械的に解決できません。使う側が好きにやって良いみたいです。
さて、すべてのタグの基本は冗長タグです。冗長タグは、ビックリマークの後、鍵括弧の中にグローバルかローカルタグを1つだけ書き込みます。
--- # グローバル・タグ、コア・スキーマの tag:yaml.org,2002:str !<tag:yaml.org,2002:str> 1 # これは整数ではなくて "1" という文字列です --- # 同上。tag:yaml.org,2002:int !<tag:yaml.org,2002:int> "1" # これは文字列ではなくて、整数 1 です --- # 同上。tag:yaml.org,2002:null !<tag:yaml.org,2002:null> "NULL" # これは文字列ではなくて、NULL です --- # ローカル・タグ。ビックリマークで始める。URI で使える文字が利用可能 !<!schwarzschildprototypemarktwo> a regular folding parasol
冗長なものをいちいち使っていられないということで、タグ・ハンドルと呼ばれる便利機能を利用できます。
--- !!str 1 # デフォルトでは !<tag:yaml.org,2002:str> --- ! 1 # デフォルトでは !<tag:yaml.org,2002:str> --- !!int "1" # 同じく !<tag:yaml.org,2002:int> --- !!null "NULL" # 同じく !<tag:yaml.org,2002:null> --- !schwarzschildprototypemarktwo a regular folding parasol
タグ・ディレクティブを使うことで、冗長でないタグのビックリマークを、どのような冗長タグへ変換するのか指定できるようになります。使い方によっては、見かけはローカル・タグでも、グローバル・タグにすることもできます。タグ・ディレクティブは単なる文字列置き換え指定なので、ローカルタグを簡略化するのにも使えます。
%TAG !! tag:example.net,2000: --- !!str 1 # グローバルタグ !<tag:example.net,2000:str> ... --- !foo "bar" # ローカル・タグ !<!foo> ... %TAG ! tag:example.net,2000:app/ --- !foo "bar" # グローバル・タグ !<tag:example.net,2000:app/foo> ... %TAG ! !schwarzschildprototype --- !marktwo a regular folding parasol # ローカルタグ !<!schwarzschildprototypemarktwo>
タグ・ディレクティブで置き換えるビックリマーク部分をタグ・ハンドルと呼びます。上のように無名のタグ・ハンドルだけでなく、名前付きのタグ・ハンドルも利用できます。名前付きのものはビックリマークで名前を挟み、名前には ASCII の英数字とハイフンを使えます。
%TAG !t! tag:example.net,2012:app/ %TAG !s! !schwarzschildprototype --- !t!datetime 2012-12-12 # グローバルタグ !<tag:example.net,2012:app/datetime> !s!marktwo a regular folding parasol # ローカルタグ !<!schwarzschildprototypemarktwo>