適当プログラマー

俺の能力はコピー。お金のコピーを繰り返して金持ちになろうと画策したが、紙幣番号が全く同じものを大量に作ってしまい、お札偽造の容疑であえなく捕まる。

XSLTのxsl:copy-ofをxsl:for-eachで書き直す

こんにちは。元気ですか?私はそこそこです。

このガルニモと言うサイトは、XHTMLとXSLTというのを使って作っています。

今回は、XSLTの基礎知識を知っている人前提のXSLTの話。

XSLTにxsl:copy-ofっていうのがありますよね。あれ便利ですよね。対象のXML(XHTML)ファイルの文章をそのままコピペ(?)できますからね。例えば以下のようなXSLTと

<xsl:copy-of select="h:div[@id='program']"/>

以下のようなXML(XHTML)で

<div id="program">
<h2>XSLTのxsl:copy-ofをxsl:for-eachで書き直す</h2>
<p>こんにちは。元気ですか?私はそこそこです。</p>
<p>このガルニモと言うサイトは、XHTMLとXSLTというのを使って作っています。</p>
</div>

divタグごと、h2タグとpタグも含めてコピペできます。あ、コードは"こんな感じだよね"って例です。基礎知識ある方なら何となく分かってくださるはず。

でも、私はこれをxsl:for-eachで書き直したい事情が出来ました。具体的に言えば、h2タグが終了した後に、グーグルアドセンスを入れたかったのです。金が欲しかったのです。はい。私がやりました。

目的は金さ!くっくっく!確かに俺は貴様の親を殺した!そして、手に入れた!!莫大な金を!!権力を!!そして全てを支配した!!俺が憎いか!?殺したいか!?よかろう!!かかってこい!!そして理解しろ!!俺様と貴様の圧倒的な力の差を──!!

力の差を理解していただけたところで、解説を続けます。copy-ofだと、まるごとコピペしちゃうんで、「このタグが出たときはアドセンスタグを入れる」っていう条件分岐が出来なかったんですよね。なので、for-eachで一つ一つの要素を出力していって、h2タグが終了したときのみアドセンスのタグを入れる、っていうコードに書き直したかった。で、とりあえずググったら、xsl:copy-ofをxsl:for-eachで書き直したよっていう情報が意外と無かったんだよね。よってここに方法を記す。XSLTを以下のように書き直したよ。

<div id="program">
<xsl:for-each select="h:div[@id='program']/*">
<xsl:copy-of select="."/>
<xsl:if test="local-name(.) = 'h2'">
<p>アドセンスだぜー。ひゃっはー!</p>
</xsl:if>
</xsl:for-each>
</div>

「XSLTファイルに<div id="program">~</div>タグを直書きするの邪道じゃない?」って突っ込まれるかもしれないけど、いいんだよ!仕事じゃなくて趣味だから適当でいいんだよ!きっかりしなくていいんだよ!きっかりしたいなら、上記をベースに自分で考えればいいじゃない!パンが無ければお菓子を食べればいいじゃない!

という話でした。誰かの役に立てば幸いです。それでは。

このエントリーをはてなブックマークに追加