してログ

Ver 1 では、再帰呼び出しのテンプレートを使うしかないです。下記のようにしてみてください。

<xsl:template name="sample">
  <xsl:param name="end"/>
  <xsl:param name="i"/>
  <xsl:if test="$end &gt; $i">
    <!-- 繰り返したい処理をここに記す -->
    <xsl:call-template name="sample">
      <xsl:with-param name="end" select="$end"/>
      <xsl:with-param name="i" select="$i + 1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

Ver 2 では、下記のように集合を指定することで、任意の回数のループを組むことができます。

<xsl:for-each select="(1 to 5)">
  <xsl:text>{.} 回目の処理です。</xsl:text>
</xsl:for-each>

HTML では、タグで囲まれた以外のところに文字を挿入できたりしますが、XSTL(XML)では、これは許されません。そこで、XSLT には、<xsl:text> がありますので、これで囲んであげます。

<xsl:text>ここに文字列を書く</xsl:text>

または、HTML の <span> タグで囲んでもよいでしょう。

文字列操作系の関数には以下のようなものがあります。

関数名 機能
concat()
contains()
format-number()
normalize-space()
starts-with()
string()
string-length()文字数の取得(バイト数ではない)します。要素が空を判断するのにこの関数を使用して、0 であるか否かで判断できます。
substring()
substring-before()
substring-after()
translate()

関数による式を挿入するには、下記のように記述すればよいでしょう。

<xsl:value-of="関数の表現"/>

Windows 2000 Server の IIS4 を使って、サーバーサイド XSLT 適用を行うサンプルです。適当なWebサイト上に下記ファイルを作り、aspをリクエストしてください。

public_office.xml

<?xml version="1.0" encoding="shift_jis" ?>
<prefecture>
  <city>
    <name>○○さん</name>
    <address>××市□□町</address>
    <url>http://www.example.jp/</url>
  </city>
</prefecture>

public_office.xsl

<?xml version="1.0" encoding="shift_jis" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="shift_jis" omit-xml-declaration="yes"/>

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

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

<xsl:template match="city">
  <xsl:value-of select="name"/>
</xsl:template>

</xsl:stylesheet>

public_office.asp

<%

Set objXML = Server.CreateObject("Microsoft.XMLDOM")
Set objXSL = Server.CreateObject("Microsoft.XMLDOM")

objXSL.async = false
objXSL.load Server.MapPath("public_office.xsl")

objXML.async = false
objXML.load Server.MapPath("public_office.xml")

Response.Write (objXML.documentElement.transformNode (objXSL.documentElement))

%>