ifeelさん、いつもご質問ありがとうございます。
このご要望(文字列の置換処理)は、XSLT的に非常に苦手な分野の為、一般的に
実現困難かと思われます。
XSLTのtranslate関数は、「文字列」ではなく「文字」を置換する為のもので、
例えばアルファベットの大文字を全て小文字に変換したい、というようなかなり特殊な
用途にしか使えません。
translate( data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqurstvwxyz' )
のように書くと、"My Documents"という文字列が"my documents"になる、
というような使い方です。
XSLTで文字列の置換を行う場合には、再帰処理という複雑なテクニックを用いる
事になります。
substring-beforeとsubstring-afterという関数があり、これらは指定した文字列が
元データ中に含まれていた場合に、それより「以前」や「以降」の文字列を取り出して返す
というものです。
考え方としては、substring-beforeで「最初に見つけた改行より前の文字列」を見つけて
<li></li>で囲んで出力し、残りを再度自分自身のテンプレートへ渡す、というテンプレート
を書くことになります。改行がなくなったら再帰を終了します。
少し興味がありましたので、サンプルを作成してみました。もしよろしければご利用下さい。
以下のソースを、<xsl:template match=...> と同レベルに置いて下さい。
</xsl:stylesheet>の直前でOKです。
コード: 全て選択
<!-- 1行ずつli要素変換するテンプレート -->
<xsl:template name="autolisting">
<xsl:param name="text" />
<!-- 文字列が改行を含まない場合は全体をli要素で囲んで出力し、終了。 -->
<xsl:if test="not(contains( $text, '
' ))">
<li><xsl:value-of select="$text" /></li>
</xsl:if>
<!-- 文字列が改行を含む場合は、改行より前の文字列をli要素に変換し、残りは再帰させる。 -->
<xsl:if test="contains( $text, '
')">
<li><xsl:value-of select="substring-before( $text, '
')" /></li>
<xsl:call-template name="autolisting">
<xsl:with-param name="text" select="substring-after( $text, '
' )" />
</xsl:call-template>
</xsl:if>
</xsl:template>
呼び出し側では、通常、
コード: 全て選択
<xsl:value-of select="item1" />
のようになっているところを、
コード: 全て選択
<xsl:call-template name="autolisting">
<xsl:with-param name="text" select="item1" />
</xsl:call-template>
のように変えて下さい。