サイトマップ(XML)にスタイル(XSLT)指定する場合の注意点
検索エンジンに対してサイトマップを利用してインデックス要求をするだけであれば、
サイトマップの仕様に従ってXMLを出力するだけなのですが、
作成したサイトマップを自分の確認用にHTMLとして整形して表示したい。
そう思うと、いきなり面倒なパターンにハマります。
ここではサイトマップ作成における注意点というかポイントをご紹介しておきます。
概要
サイトマップの仕様とサンプル
サイトマップは以下のような形式で出力する単なるXMLファイルです。
サイトマップインデックス
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap><loc>https://rensrv.com/sm_demo/sitmap_100.xml</loc><lastmod>2018-05-30</lastmod></sitemap> <sitemap><loc>https://rensrv.com/sm_demo/sitmap_200.xml</loc><lastmod>2018-05-30</lastmod></sitemap> <sitemap><loc>https://rensrv.com/sm_demo/sitmap_300.xml</loc><lastmod>2018-05-30</lastmod></sitemap> <sitemap><loc>https://rensrv.com/sm_demo/sitmap_400.xml</loc><lastmod>2018-05-30</lastmod></sitemap> <sitemap><loc>https://rensrv.com/sm_demo/sitmap_500.xml</loc><lastmod>2018-05-30</lastmod></sitemap> </sitemapindex> |
サイトマップ
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://rensrv.com/weekday/1900/01/01/</loc><lastmod>2018-05-30</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url> <url><loc>https://rensrv.com/weekday/1900/01/02/</loc><lastmod>2018-05-30</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url> <url><loc>https://rensrv.com/weekday/1900/01/03/</loc><lastmod>2018-05-30</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url> <url><loc>https://rensrv.com/weekday/1900/01/04/</loc><lastmod>2018-05-30</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url> <url><loc>https://rensrv.com/weekday/1900/01/05/</loc><lastmod>2018-05-30</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url> </urlset> |
サイトマップの仕様等は、以下のサイトマッププロトコルに則って作成する事になっています。
ルート要素に名前空間の宣言は必須(Googleが食べない)
サイトマップ/サイトマップインデックスを検索エンジンへ登録依頼する前に、
Webで表示確認ができるようにと試行錯誤をしていて、
どうしてもXSLT(スタイルシート)の割り当てができず困りました。
その一番のポイントが以下の記述に起因しています。
サイトマップインデックスの場合は、ルート要素を以下のように書きます。
「<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
」
またサイトマップの場合も同様に以下のように書きます。
「<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
」
どちらも「xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
」と、
デフォルトネームスペース(xmlns="~"
)の記載があり、
このXMLの名前空間の定義がされています。
Googleではこの名前空間の定義が無い場合、
サイトマップの要求は受け付けてくれますが、画面にエラーが表示されます。
型 | 問題 | 説明 |
---|---|---|
エラー | 誤ったネームスペース | サイトマップまたはサイトマップ インデックス ファイルのネームスペース宣言が不適切です。 |
サイトマップにXSLTスタイルシートが割り当てられない・・・と悩み、
デフォルトネームスペースを消すと、後からエラーを目にする事になります。
ルート要素の名前空間宣言に別名を付けるとNG(Googleが食べない)
ルート要素にデフォルトネームスペースが割り当てられていて、
接頭辞(別名)を付けておけば、スタイルシート側で処理がしやすいのではないかと、
XML側に接頭辞を付けても、同様にエラーになります。
「<sitemapindex xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
」
「<urlset xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
」
XML側は基本仕様のまま触らず、表示に関してはすべてXSLT側で定義します。
XML側に接頭辞を付ける必要はありません。
XSLスタイルシート上で値参照には別名を活用する
個人的には「接頭辞」を付けずにXSLT側でXMLの値の取得がしたかったのですが、
現時点ではその方法が見つかっていません。
以下の記載方法をすれば、
Googleが受け付けるXMLに対してのXSLTスタイルシートの割り当てが可能です。
PHPからXML出力する前にヘッダーの送出を行う
サイトマップをファイルではなくURLの要求に合せて、
PHPなどで出力するような場合、以下のように私はしています。
実際にはURLリライトを行って、.xml形式でURLを認識するようにしています。
.htaccessに以下のように記載します。
RewriteRule ^sm_demo/sitmap_index.xml$ /sm_demo/sitemap_idx.php [L]
以下のURLにアクセスすれば、上記のphpが呼び出され、処理されます。
さて、このphpの中身は以下のようになっていますが、
ポイントとしては「 header('Content-Type: text/xml');
」部分で、
PHPからXML出力を行う「echo $xml->asXML();
」の前に、
HTMLヘッダーの送出を行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php $obj = new sitemapidx_gen; $xml = $obj->proc_sm(); if(!$xml == false){ header('Content-Type: text/xml'); //ヘッダーの出力が必要 echo $xml->asXML(); }else{ echo 'XML生成に失敗しました'; } class sitemapidx_gen{ private $dom = ''; //**コンストラクタ function __construct(){ if (empty($_SERVER["HTTPS"])) { $prot = "http://"; } else { $prot = "https://"; } if (empty($_SERVER["HTTP_HOST"])) { //直接実行 $this->dom = 'http://rensrv-com.pisolith.local/'; }else{ $this->dom = $prot. $_SERVER["HTTP_HOST"] . '/'; } } //**デストラクタ function __destruct(){ } //サイトマップ生成処理 function proc_sm(){ $xmlstr =<<<xm <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/sm_demo/sitemapindex_template.xsl" ?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></sitemapindex> xm; //XML生成 $xml = new \SimpleXMLElement($xmlstr); $y = 100; //100年単位で日付ごとにURLを作成する for($i = $y; $i < 9999; $i=$i+100){ $cur_y = (string)$i; //URL生成 $url = $this->dom ."sm_demo/sitmap_{$cur_y}.xml"; //XMLに追加 $xmlitem = $xml -> addChild("sitemap"); $xmlitem -> addChild('loc', $url); $xmlitem -> addChild('lastmod', '2018-05-30'); } return $xml; } } |
実際、このヘッダー出力の1行をコメントアウトすると、
以下のようにスタイルが全く割り当てられていない状態の表示になってしまいます。
XMLに対してスタイルシートが割り当てられない・・・と悩んだ際には、
確認されるといいかもしれません。
尚、このPHPファイルについては以下の記事でご紹介したものになります。
編集・確認を効率的にするために
XMLとXSLTの表示確認をする際に、ローカル環境にApacheが動作している場合はいいのですが、
サーバー上にアップロードしては表示確認を繰り返すのは苦痛です。
そんな時はWebサービス上でスタイルの確認をしながら双方を編集し確認すると便利です。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: