水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2001年のえび日記 > 2001年10月 > 2001年10月4日(木曜日)

2001年10月4日(木曜日)

要素を 2つずつまとめる XSLT

yuuさんの電波を受信しつつ完成?

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>

<xsl:template match="/">
 <xsl:apply-templates/>
</xsl:template>

<xsl:template match="foo">
 <xsl:if test="position() mod 4 = 2">
  <xsl:text disable-output-escaping="yes">&lt;bar&gt;</xsl:text>
 </xsl:if>

 <foo><xsl:value-of select="current()"/></foo>

 <xsl:choose>
  <xsl:when test="position() mod 4 = 0">
   <xsl:text disable-output-escaping="yes">&lt;/bar&gt;</xsl:text>
  </xsl:when>
  <xsl:when test="current() = ../foo[last()]">
   <xsl:text disable-output-escaping="yes">&lt;/bar&gt;</xsl:text>
  </xsl:when>
 </xsl:choose>
</xsl:template>

</xsl:stylesheet>

美しくない……。もっとスマートなやり方ってないのっ?

ちなみに foo要素と foo要素の間にある CRLF も一つのノードとして扱われていて、position() はそれもカウントした値を返している模様。

※考えてみればこれは当然で、"<span>foo</span><span>bar</span>" の span要素の間に CRLF があったら、それはちゃんと語の区切りとして機能してもらわないと困ります。

関連する話題: XML / XSLT / もののけ / yuuさん

最近の日記

関わった本など