HTML連絡先情報
最も人気があり、定評のあるマイクロフォーマットの1つがhCardです。 これはvCard HTMLビューです(hCardの「h」は「HTML vCard」の略です)。 microformats wikiで hCardの詳細を読むことができます 。 vCardには、個人または組織に関する基本情報が含まれています。 この形式は、連絡先情報をバックアップおよび共有する方法として、アドレス帳アプリケーションで広く使用されています。 インターネットの標準では、これは古い形式であり、その仕様は1998 RFC2426です。 これはXMLの前であったため、構文は、区切り文字と開始および終了の要素を持つプレーンテキストです。 私の情報を例にとってみましょう:
開始:VCARD FN:ブライアン・スーダ N:スーダ;ブライアン;;; URL:http://suda.co.uk 終了:VCARD
このvCardファイルには、BEGIN:VCARDおよびEND:VCARD要素が含まれています。これらの要素は、データの収集をいつ停止するかをパーサーが知っているコンテナーです。 1つのファイルに複数のvCardを含めることができるため、この方法でデータをきれいなvCardにグループ化します。 FNは「フォーマットされた名前」を意味し、表示する名前として使用されます。 Nは、実際の名前、姓、ミドルネーム(ミドルネーム)、プレフィックスとサフィックスがエンコードされた構造化された名前であり、これらはすべてセミコロンを使用して区切られます。 最後に、URLはこの連絡先に関連付けられているサイトのアドレスです。
これらすべてをXMLでコーディングする必要がある場合、結果はおそらく次のようになります。
<vcard> <fn>ブライアンスーダ</ fn> <n> <given-name>ブライアン</ given-name> <family-name>須田</ family-name> </ n> <url> http://suda.co.uk </ url> </ vcard>
マイクロフォーマットを使用してHTMLで同じデータをマークアップする方法を見てみましょう。マイクロフォーマットは、rel、rev、およびclass属性を広く使用してセマンティクスをエンコードします。 class属性は、XMLで要素が使用されるのとほぼ同じ方法で使用されます。 したがって、前のXMLの例は、次のようにHTMLでレイアウトされています。
<div class = "vcard"> <div class = "fn">ブライアンスーダ</ div> <div class = "n"> <div class = "given-name">ブライアン</ div> <div class = "family-name">須田</ div> </ div> <div class = "url"> http://suda.co.uk </ div> </ div>
これがすべてmicroformatsに対応していれば、それほど面白くないでしょう。 ただし、マイクロフォーマットを使用すると、既存のHTML要素のセマンティクスを活用して、エンコードされたデータの場所を説明できます。 この例では、各要素は<div>ですが、これは必須ではありません。 これにより、パーサーはHTMLからデータを抽出するのが少し難しくなりますが、ドキュメントの作成者は簡単になります。 Microformatsは、著者に現在のHTML構造または公開方法を変更することを強制しません。 結局、パーサーライターよりもHTMLを書く人の数が桁違いに多いので、著者の生活を単純化してみませんか?
前のXMLの例を見ると、「ブライアンスーダ」が2回、FNで1回、次にNで2回表示されるのが気に入らない。これはHTMLの問題ではなく、スペースで区切られた値を使用してこれらのXML要素を組み合わせることができますクラス属性。 あまり知られていない事実-class、rev、およびrel属性は、スペースで区切られた値のリストを持つことができます。 FNとNを組み合わせると、次のようになります。
<div class = "n fn"> <div class = "given-name">ブライアン</ div> <div class = "family-name">須田</ div> </ div>
現在、プロパティNにはまだ子プロパティがあり、FNには以前と同じ値が含まれています。 思い出すと、HTMLはスペースを圧縮するため、div内にスペースがある2つの要素に分割されているにもかかわらず、FN値は「Brian Suda」のままです。
これが、プロパティを同一の概念と組み合わせる機能を指定した方法です。 XMLの例で次に目を引くのは、URLの表示方法で、自然に見えません。 XMLではデータについて説明しますが、HTMLはブラウザー内のユーザーに表示されます。 偶然にも、URL値を取り、さらに人間にわかりやすいテキストを表示するテキスト値を持つhref属性を持つ<a>要素があります。 <div>要素を<a>に変更することで、引き続きHTMLの例を改良できます。
<a class="n fn url" href="http://suda.co.uk"> <span class = "given-name">ブライアン</ span> <span class = "family-name">スーダ</ span> </a>
<a>要素に含めることができるのはインラインレベルの子のみであるため、<a>要素に切り替えた後、子divをスパンに置き換える必要があります。 Microformatsは、作成者に特定の要素の使用を強制しませんが、それぞれの場合に最もセマンティックを使用することが推奨されます。 URLの場合、<a>を使用することをお勧めします。そのため、解析ルールはわずかに変更されます(これについては後で説明します)。
HTMLの最終的なhCardマイクロフォーマットは次のようになります。
<div class = "vcard"> <a class="n fn url" href="http://suda.co.uk"> <span class = "given-name">ブライアン</ span> <span class = "family-name">スーダ</ span> </a> </ div>
私の意見では、これは最初のXMLの例よりもはるかに直感的でシンプルでコンパクトです。 人々はすでにこの方法でブログのロールとリンクを公開しており、すべてのブラウザーがこの情報を認識してスタイルを設定しているため、フィードに簡単に入れることができます。
XSLTを使用したParsim
MicroformatsはHTML 4以降で動作するように設計されています。 XSLTを使用する場合の欠点は、ドキュメントを正しく形成する必要があることです。これはHTML 4では必要ありません。 HTML 4では、タグ<br>、<img>および<hr>は、タグを閉じることなく使用できます。 REGEXやDOMなどのマイクロフォーマットを抽出するために別のテクノロジーを使用した場合、それは別の問題になりますが、XSLTでは最初にHTMLをクリーンアップする必要があります。 これを行うには2つの簡単な方法があります。TIDYまたはHTMLlibやloadHTMLのような関数は、どちらもHTMLドキュメントをロードし、XSLTの有効なドキュメントに変換します。
整形式のHTMLドキュメントがあることがわかったので、マイクロフォーマットデータの抽出を開始できます。 以下は非常に粗雑なXSLTであり、完璧とはほど遠いですが、初心者には十分なはずです。 詳細については、 wikiページを解析するmicroformats.orgを読むか、データを抽出するハードワークのほとんどを行うXSLTテンプレートを使用できます( hg.microformats.orgで入手可能)。
すべてのhCardデータは、vcardクラスを持つ要素内に含まれています。 この例では、これは<div>ですが、任意の要素にすることができるため、これから始めます。
// * [@ class = "vcard"]
このXPath式は、クラス「vcard」を持つツリー内の要素を探します。 一見、すべてのhCardが検出されるように見えますが、問題はクラス値がスペースで区切られた値のリストになる可能性があることです。 したがって、class = "vcard myStyle"コードは、このXPath式では選択されません。 これを修正するには、contains関数を使用します。
// * [含む(@class、 "vcard")]
これは、クラス属性に「vcard」が含まれる要素を見つけることができるようになったためです。 式class =“ vcard myStyle”では、“ vcard”が正常に見つかりますが、別の問題があります。 contains関数はサブストリング検索であるため安全ではありません。 したがって、「my-vcard」は有効なプロパティ名ではないという事実にもかかわらず、class =「vcard」と同じ方法で、contains()関数によってclass =「my-vcard」が検出されます。 hCard。 誤った偶然。 これを修正するには、目的の値をわずかに活用してスペースで囲み、スペースでラップされた新しい値を探す必要があります。 複雑に聞こえますが、実際にはそうではありません。
// * [含む(concat( ""、@ class、 "")、 "vcard")]
スペースがある場合、クラス「my-vcard」は「my-vcard」のように見え、サブストリング「vcard」を含まないため、サブストリングの問題が解決します。 別のケースでは、クラス「vcard myStyle」は「vcard」を含む「vcard myStyle」に変わるため、この手法を使用してスペースで区切られた値も検出されます。
データの検索方法がわかったので、XSLTを使用して各hCardを調べ、vCardとして出力を開始しましょう。 この時点で、XSLTを使用してHTMLデータをほぼすべての形式に簡単に変換できることを確認するのはすでに簡単です。 たとえば、他のHTML、XML、RDF、vCard、CSV、SPARQL、JSONテキストなど、あなたの心が望むもの。
for-eachステートメントは、ページ上のすべてのhCardを見つけ、それぞれのvCardを作成します。 vCardを作成するとき、彼はFN、N、URLなどのhCard検索パターンを使用します。
<xsl:for-each select = "// * [contains(concat(" "、@ class、" ")、" vcard ")]"> <xsl:text>開始:VCARD </ xsl:text> <xsl:apply-templates /> <xsl:text> END:VCARD </ xsl:text> </ xsl:for-each>
FNは、FNを含むクラスを持つ要素の値を取得する単純なテンプレートです。
<xsl:template match = "// * [contains(concat(" "、@ class、" ")、" fn ")]"> <xsl:text> FN:</ xsl:text> <xsl:value-of select = "。" /> </ xsl:template>
パターンNはもう少し複雑です。 最初に、Nを含むクラスを持つ要素を見つける必要があります。次に、姓や名など、Nのサブプロパティを含む子要素を検索し、それらの値を表示します。
<xsl:template match = "// * [contains(" "、@ class、" ")、" n ")]"> <xsl:text> N:</ xsl:text> <xsl:value-of select = "// * [contains(" "、@ class、" ")、" family-name ")]" /> <xsl:text>; </ xsl:text> <xsl:value-of select = "// * [contains(concat(" "、@ class、" ")、" given-name ")]" /> <xsl:text> ;;; </ xsl:text> </ xsl:template>
URLテンプレートはchoose要素を使用して、URL値の最も意味的な情報がどこにあるかを判断します。 クラス「url」を持つ要素が<a>要素かどうかを確認します。 その場合、アドレス値はhrefから取得され、そうでない場合は、文字列コンテンツが使用されます。
<xsl:template match = "// * [contains(" "、@ class、" ")、" url ")]"> <xsl:text> URL:</ xsl:text> <xsl:選択> <xsl:test = "local-name()= 'a'">の場合 <xsl:value-of select = "@ href" /> </ xsl:when> <xsl:それ以外> <xsl:値の選択= "。" /> </ xsl:それ以外> </ xsl:選択> </ xsl:template>
要素<a>および他の多くの要素は、独自のセマンティクスを保持しています。 元のHTMLの例では、URLは<div>を使用してエンコードされました。この場合、コンテンツは取得され、URLは同じになります。 これは、マイクロフォーマットをXMLと異なるものにする多くの要素の1つにすぎません。 マイクロフォーマットデータの解析は、エンコードされたHTMLのタイプと要素によって異なります。
これは、microformatからデータを抽出する非常に簡単な概要でした。 また、vCardプロパティのタイプに依存し、HTML要素が構築されるルールもあります。 詳細については、 microformats wiki 、「 Microformatsの使用」を使用した私のPDF を参照するか、質問がある場合はいつでもメールでmicroformats開発者ニュースレターを購読できます。