disable-output-escaping

何度か挫折を繰り返してますが、最近またXSLTを勉強してます。ウェブ上の資料だけで学ぶのには流石に限界を感じたため本を買うことにしまして、少々高めながらも『XSLT実践ガイド [Amazon.co.jpで「XSLT実践ガイド」を参照]』を先日購入。まだ読み途中ですが、分かり易くて良い本だと思います。

取り敢えずは短編の更新を楽にすることを目標に。

* * *

多少分かってくると色々と試してみたくなりますが、先日お見かけしたMini Sapphireの日記の4月26日分、属性値に文字参照を含めるで触れられていた問題について考えてみたり。といっても以前にねこめしにっきで同じ問題に触れられており、そこでも示唆されていた方法ですが、xsl:text要素とdisable-output-escaping属性を使ってタグ自体を文字列として直書きすればなんとかなりそうです。

例えば、 <mail>kits@akatsukinishisu.net</mail> という要素を <a href="kits&#64;akatsukinishisu.net">mail</a> という風に変換する場合には、こんなテンプレートで。

<xsl:template match="mail">
 <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
 <xsl:value-of select="substring-before(., '@')"/>
 <xsl:text disable-output-escaping="yes">&amp;#64;</xsl:text>
 <xsl:value-of select="substring-after(., '@')"/>
 <xsl:text disable-output-escaping="yes">"&gt;mail&lt;/a&gt;</xsl:text>
</xsl:template>

綺麗な方法とは言い難いですが、XSLT 1.0の範囲で何とかなるという点では色々と応用できるのではないかと思います。一応手元のXalan-Java, xsltproc(libxslt), XT, sabcmd(sablotron)では望みの出力を得ました。

と思ってたらそうならないXSLTプロセッサをひとつ発見。Mozilla内蔵のXSLTプロセッサは、このようにして出力したタグをXMLタグとして認識せず、ウィンドウに <a href="kits&#64;akatsukinishisu.net">mail</a> という文字列がそのまま表示されてました。うーむ、それはそれで正しい動作のような気も……。

* * *

XMLからXHTMLの変換における問題では、「brなどの空要素を出力する際に、 <br /> の"<br"と"/>"の間の空白が削られる」というのがありますが、それもこのようにすれば良いような(br要素をそのままbr要素として出力する例)。

<xsl:template match="br">
 <xsl:text disable-output-escaping="yes">&lt;br /&gt;&#10;</xsl:text>
</xsl:template>

というのも既に述べられている話ではありますが。

(2004年5月2日)

北村曉 kits@akatsukinishisu.net