atom:contentをXSLTを使って表示する時

XSLT、一日や二日でそう簡単に扱えるような代物ではなかったみたい…。atom:contentでエントリーの本文を拾う時にハマッテしまった。なかなか難しいんだな。

今回は、エントリーの編集画面を作っているので、textareaに本文を入れる必要があった。だけどXSLT

<textarea><xsl:value-of select="atom:content"/></textarea>

と書いてしまうと、mt-atom.cgiでのAtomにはatom:contentとその子のdivの間にホワイトスペースが入っているので、それがtextareaの中にも入ってしまうし、エントリー本文の中で使っているHTMLタグが消えてしまう。

それで悩んでいた時にRe: Atom の XSLTを見つけて、よく読んだらやっと以下のような正解を見つけた。

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:atom="http://purl.org/atom/ns#"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='no'/>

<xsl:template match="atom:entry">
  <textarea><xsl:copy-of select="atom:content/xhtml:div/node()"/></textarea>
</xsl:template>

</xsl:stylesheet>

上に挙げたnantoさんのページでは

<xsl:copy-of select="atom:content/xhtml:div"/>

と言った感じになっているけど、この場合はdiv要素ごと表示される感じ。更に中身だけ欲しければ今回のようにnode()を指定する。これで一応なんとかなった。あとnamespaceをちゃんと書くのを忘れてしまったのも結構あったな、気をつけないと…。

でも今書いたXSLTだとFirefoxではエントリーの中で使っているHTML要素にも全部いちいちxmlns="http://www.w3.org/1999/xhtml"って属性が入っちゃう。これどうにかならないかなぁ。まだ模索が必要か…

けどXSLTって本当にいいな。もっとちゃんと勉強して自由に書けるようになろっと。