wwwc用metaタグを作る
もくろみ
バナーも張っていますが,トップページにはwwwc用のmetaタグをつけています.こんな感じです.
<!-- index.html --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta name="Generator" content="written by xyzzy. transformed by XT" /> <meta name="wwwc" content="2002.10.20 歳時記・リンク更新" /> <!-- wwwc用metaタグ --> [一部省略] <h1>眠る猫の頁</h1> <p><img width="333" height="250" src="cat.jpg" alt="" /></p> <dl> <dt><a href="whatsnew/index.html">新着</a></dt> <dd class="contentDef"> 2002.10.20 <ul> <li><a href="saijiki/index.html">歳時記</a>に2002.10.13から2002.10.19までを追加.</li> <li><a href="links/index.html">リンク</a>に「悪徳商法?マニアックス」を追加.</li> </ul> </dd> <dt><a href="saijiki/index.html">歳時記</a></dt> <dd class="contentDef"> 日々の出来事など. </dd> [以下省略]
inex.htmlの元になるindex.xmlでもこのmetaタグはべた打ちしています.
<!-- index.xml --> <?xml version="1.0" encoding="utf-8"?> <root> <meta name="wwwc" content="2002.10.20 歳時記・リンク更新" /> <!-- wwwc用metaタグ --> <h1>眠る猫の頁</h1> <p><img width="333" height="250" src="cat.jpg" alt=""/></p> <contents> <content href="whatsnew/index.html" name="新着"> 2002.10.20 <ul> <li><a href="saijiki/index.html">歳時記</a>に2002.10.13から2002.10.19までを追加.</li> <li><a href="links/index.html">リンク</a>に「悪徳商法?マニアックス」を追加.</li> </ul> </content> <content href="saijiki/index.html" name="歳時記"> 日々の出来事など. </content> [以下省略]
index.xmlからindex.htmlを作るindex.xslもこのmetaタグをそのまま表示しています.
<!-- index.xsl --> <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/> <xsl:template match="/root"> <html > <xsl:call-template name="head"/> <xsl:call-template name="body"/> </html> </xsl:template> <xsl:template name="head"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Script-Type" content="text/javascript"/> <meta name="Generator" content="written by xyzzy. transformed by XT"/> <xsl:apply-templates select="meta"/> <!-- index.xmlに記述したmetaタグをそのまま出力 --> <xsl:call-template name="link"/> <link rev="made" href="mailto:foo@bar"/> <title><xsl:value-of select="/root/h1"/></title> </head> </xsl:template> <xsl:template match="meta"> <xsl:copy-of select="."/> </xsl:template> [以下省略]
新しくした箇所は「wwwc用のmetaタグ」と「新着」の2箇所に記述があります.2箇所で同じ内容を書くのはミスの元です.現にwwwc用のmetaタグは何度も書き忘れたことがあります.ということで,xsltを使って,「新着」からwwwc用のmetaタグを作ることにしました.要するに,wwwc用のmetaタグの記述のないindex.xmlから,wwwc用のmetaタグのあるindex.htmlを作成します.
<!-- wwwcのmetaタグがないindex.xml --> <?xml version="1.0" encoding="utf-8"?> <root> <h1>眠る猫の頁</h1> <p><img width="333" height="250" src="cat.jpg" alt=""/></p> <contents> <content href="whatsnew/index.html" name="新着"> <!-- ここの記述から‘<meta name="wwwc" content="2002.10.20 歳時記・リンク更新"/>’を作る --> 2002.10.20 <ul> <li><a href="saijiki/index.html">歳時記</a>に2002.10.13から2002.10.19までを追加.</li> <li><a href="links/index.html">リンク</a>に「悪徳商法?マニアックス」を追加.</li> </ul> </content> <content href="saijiki/index.html" name="歳時記"> 日々の出来事など. </content> [以下省略]
実行
mata
タグのうちcontent
に設定する文字列以外は固定です.したがって,‘2002.10.20 歳時記・リンク更新’の部分を作成すればOKです.更新日付はcontent
タグ直下のテキストノード,更新した箇所はcontent/ul/li/a
から取得できます.
<!-- wwwc.xsl --> <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/> <xsl:template match="/"> <xsl:value-of select="/root/contents/content[@name='新着']/text()"/> <xsl:apply-templates select="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"/> <!-- 呼出すテンプレートにmode="wwwc"をつけたのでつける --> </xsl:template> <xsl:template match="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"> <!-- mode="wwwc" はなくても動く.後で見て,このテンプレートってなんだっけ?となった時わかるように --> <xsl:value-of select="."/> <xsl:choose> <xsl:when test="position()!=last()">・</xsl:when> <xsl:otherwise>更新</xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
<xsl:for-each>
を使ってこのように書くこともできます.
<!-- wwwc-forecah.xsl -->
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output
method="xml"
encoding="utf-8"
indent="no"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
<xsl:template match="/">
<xsl:value-of select="/root/contents/content[@name='新着']/text()"/>
<xsl:for-each select="/root/contents/content[@name='新着']/ul/li/a">
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position()!=last()">・</xsl:when>
<xsl:otherwise>更新</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
このxsltを実行するとこのような結果となります.当然ですがapply-templates
を使った場合もfor-each
を使った場合もどちらも同じ結果です.cygwin上のbash,xsltプロセッサはXT,utf-8をShift JISに変換するためimdkcvを使っています.
$ xt index.xml wwwc.xsl|imdkcv -sn <?xml version="1.0" encoding="utf-8"?> 2002.10.27 歳時記・漂流記更新
この結果をそのまま変数にして,metaタグを作りました.
<!-- wwwc.xsl --> <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/> <xsl:template match="/"> <xsl:variable name="update"> <!-- 変数updateに結果を設定 --> <xsl:value-of select="/root/contents/content[@name='新着']/text()"/> <xsl:apply-templates select="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"/> </xsl:variable> <meta name="wwwc" content="{$update}"/> <!-- metaタグを作成 --> </xsl:template> <xsl:template match="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"> <xsl:value-of select="."/> <xsl:choose> <xsl:when test="position()!=last()">・</xsl:when> <xsl:otherwise>更新</xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
実行すると,contentの中に 	
が現れました.
$ xt index.xml wwwctest.xsl.2|imdkcv -sn <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE meta PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/ DTD/xhtml11.dtd"> <meta name="wwwc" content=" 	 2002.10.20 	 歳時記・リンク更新"/>
index.xmlの日付2002.10.20の前にある改行( )とタブ(	)です.
<!-- wwwcのmetaタグがないindex.xml --> [一部省略] <content href="whatsnew/index.html" name="新着"> ←ここにある改行( ) 2002.10.20 ↑ ここにあるタブ(	) <ul> <li><a href="saijiki/index.html">歳時記</a>に2002.10.13から2002.10.19までを追加.</li> <li><a href="links/index.html">リンク</a>に「悪徳商法?マニアックス」を追加.</li> </ul> </content> <content href="saijiki/index.html" name="歳時記"> 日々の出来事など. </content> [以下省略]
normalize-space()
を使って前後の改行とタブを取り去ります.
<!-- wwwc.xsl -->
[一部省略]
<xsl:template match="/">
<xsl:variable name="update">
<xsl:value-of select="normalize-space(/root/contents/content[@name='新着']/text())"/>
<xsl:apply-templates select="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"/>
</xsl:variable>
<meta name="wwwc" content="{$update}"/>
</xsl:template>
<xsl:template match="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc">
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position()!=last()">・</xsl:when>
<xsl:otherwise>更新</xsl:otherwise>
</xsl:choose>
</xsl:template>
[以下省略]
$ xt index.xml wwwctest.xsl.2 |imdkcv -sn <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE meta PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/ DTD/xhtml11.dtd"> <meta name="wwwc" content="2002.10.20歳時記・リンク更新"/>
更新日付と更新内容の間の空白もなくなってしまったので,concat()
を使って改めて付加します.
<!-- wwwc.xsl -->
[一部省略]
<xsl:template match="/">
<xsl:variable name="update">
<xsl:value-of select="concat(normalize-space(/root/contents/content[@name='新着']/text()),' ')"/>
<xsl:apply-templates select="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"/>
</xsl:variable>
<meta name="wwwc" content="{$update}"/>
</xsl:template>
<xsl:template match="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc">
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position()!=last()">・</xsl:when>
<xsl:otherwise>更新</xsl:otherwise>
</xsl:choose>
</xsl:template>
[以下省略]
$ xt index.xml wwwctest.xsl.2 |imdkcv -sn <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE meta PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/ DTD/xhtml11.dtd"> <meta name="wwwc" content="2002.10.20 歳時記・リンク更新"/>
できあがったテンプレートを名前付きテンプレートにしてindex.xslに追加します.
<!-- index.xsl --> <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/> <xsl:template match="/root"> <html > <xsl:call-template name="head"/> <xsl:call-template name="body"/> </html> </xsl:template> <xsl:template name="head"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Script-Type" content="text/javascript"/> <meta name="Generator" content="written by xyzzy. transformed by XT"/> <xsl:call-template name="wwwc"/> <!-- wwwc用metaタグを作成 --> <xsl:call-template name="link"/> <link rev="made" href="mailto:foo@bar"/> <title><xsl:value-of select="/root/h1"/></title> </head> </xsl:template> <xsl:template name="wwwc"> <xsl:variable name="update"> <xsl:value-of select="concat(normalize-space(/root/contents/content[@name='新着']/text()),' ')"/> <xsl:apply-templates select="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"/> </xsl:variable> <meta name="wwwc" content="{$update}"/> </xsl:template> <xsl:template match="/root/contents/content[@name='新着']/ul/li/a" mode="wwwc"> <xsl:value-of select="."/> <xsl:choose> <xsl:when test="position()!=last()">・</xsl:when> <xsl:otherwise>更新</xsl:otherwise> </xsl:choose> </xsl:template> [以下省略]
index.htmlを作って確認します.
<!-- index.html --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta name="Generator" content="written by xyzzy. transformed by XT" /> <meta name="wwwc" content="2002.10.20 歳時記・リンク更新" /> <!-- wwwc用metaタグ --> [一部省略] <h1>眠る猫の頁</h1> <p><img width="333" height="250" src="cat.jpg" alt="" /></p> <dl> <dt><a href="whatsnew/index.html">新着</a></dt> <dd class="contentDef"> 2002.10.20 <ul> <li><a href="saijiki/index.html">歳時記</a>に2002.10.13から2002.10.19までを追加.</li> <li><a href="links/index.html">リンク</a>に「悪徳商法?マニアックス」を追加.</li> </ul> </dd> <dt><a href="saijiki/index.html">歳時記</a></dt> <dd class="contentDef"> 日々の出来事など. </dd> [以下省略]
wwwc用のmetaタグができていました.終了です.
その後
wwwcで更新をチェックしてみました.「更新あり」のマークはついたのですが,文字コードがUTF-8なので日付以外が化けています.うーむー.