ふとしたことから、日本語以外の言語で書かれている文書にリンクしているa要素に、hreflang属性をつけて見ようと思い立ちました。というか、その作業の際間違えてagendaを空更新してしまった事に気づいたので(謎)急いででっち上げた文章です。こんなことを書く予定はありませんでした。
サイト内全文書についてこれを行うとなると、手作業ではやる気がしません。レスポンスヘッダから言語に関する情報を得られれば完全自動化できた筈だったのですが、日本語以外の言語で書かれているかどうかを判別する手がかりとしては、結局のところリンクしているリソースのURIしかありませんでした。従ってある程度の手作業が必要でした。
href属性を持ちつつhreflang属性を持たないa要素は、XPathで次のように特定できます。
このロケーションパスにマッチしたa要素を抜き出します。
href属性に、ne.jp, or.jp, gr.jp, ac.jp, japan, 等々、日本語を匂わせる文字列が含まれたURIがあった場合、そのa要素を切り捨てます。
残ったa要素をリストアップします。この際に、言語を選択するためのラジオボタンも一緒に生成しました。GUI的に操作する為、HTML文書として作成します。私がJScriptに拘る理由がここにあるわけです。
100個ほどのアンカーについて、手作業で終了リソース(リンク先)の言語を判別しました。ラジオボタンをチェックする形です。
手作業で行った言語情報を元に、DOMインターフェイスを使って全a要素にhreflang属性を与えます。
さて、ここでやってしまいました。XPathをミスったのです。
var uri = elmA.getAttribute('href');
// elmA : リストアップした個々のa要素
var sXpath = 'descendant::a[string(@href) =' + uri + ']'
リストアップした個々のa要素のhref属性値と同じhref属性値を持ったソース文書中のa要素を、Xpathを使って特定する箇所です。JScriptを使っていますが、データ型については別の頭を使わなくてはならないことをすっかり忘れています。次のようにURIにstring関数を適用しなければなりませんでした:
但し、これはMSのDOM独自拡張メソッド「selectNode」を使う際の注意事項で、XSLTの文脈においては、述語内に$foo のような形で変数参照を書くことが出来ます。
ちなみに、ソース文書は名前空間無しのXML文書ですから、ノードテスト(a)に名前空間接頭辞が要りません。
ともあれsetAttributeでhreflang属性を付加し、文書を保存して終了。for文でぐるぐる回すわけです。今回の台本で滅多に使わないDocumentFragmentを利用しましたが、次回更新時にその部分を紹介してみたいと思います。
hreflang属性を手がかりに、アンカーの隣に国旗の画像か何かをつけてみるのも面白いかも知れません。a要素にマッチするXSLTテンプレートを修正することになるわけですが、問題は「どこまでやるか」です。ISO 639 (英語)にhreflang属性の取り得る値が色々出ていますが、これら全てを考慮に入れるわけにも行きません。
と、ここまで書いて、言語と国に必然的な関係など無いことに気づきました。