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の中に&#10;&#9;が現れました.

$ 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="&#10;&#9;  2002.10.20&#10;&#9;  歳時記・リンク更新"/>
  

index.xmlの日付2002.10.20の前にある改行(&#10;)とタブ(&#9;)です.

<!-- wwwcのmetaタグがないindex.xml -->
[一部省略]
    <content href="whatsnew/index.html" name="新着"> ←ここにある改行(&#10;)
      2002.10.20

ここにあるタブ(&#9)
      <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なので日付以外が化けています.うーむー.