ここでの本当の問題は、各単語をどのように大文字にするのかということではなく、与えられたテキストを個々の単語にトークン化する方法です。
言葉は常にスペースで区切られていることを仮定することができる場合 - あるいは少なくともスペースで終わる文字列で - あなたは、このようにそれを行うことができます:
<xsl:template match="something">
<!-- some stuff -->
<div>
<xsl:call-template name="capitalize">
<xsl:with-param name="text" select="clientName"/>
</xsl:call-template>
</div>
<!-- other stuff -->
</xsl:template>
<xsl:template name="capitalize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:variable name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="word" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$word">
<xsl:value-of select="translate(substring($word, 1, 1), $lower-case, $upper-case)"/>
<xsl:value-of select="translate(substring($word, 2), $upper-case, $lower-case)"/>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<xsl:value-of select="$delimiter"/>
<!-- recursive call -->
<xsl:call-template name="capitalize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
。なお、これは、次のような値で失敗します。
<clientName>HILLARY RODHAM-CLINTON</clientName>
<clientName>HILLARY (RODHAM) CLINTON</clientName>
<clientName>GEORGE BUSH THE THIRD</clientName>
<clientName>CHARLES DE GAULLE</clientName>
<clientName>RENÉE ZELLWEGER</clientName>
など、おそらく私は今考えることができません。
プロセッサがXSLT 2.0をサポートしていますか? –
わかりません。私はXSLT 1.0を使用しています –