編集済み:元のポスターからの説明により、アンダースコアで区切られた最初の文字列の開始文字を大文字にしないでください。
このソリューションは再帰を使用しないため、非常に効率的です。
これが新しい解決策です:
string-join(
(for $i in 1 to count(tokenize(.,'_')),
$s in tokenize(.,'_')[$i],
$fl in substring($s,1,1),
$tail in substring($s,2)
return
if($i eq 1)
then $s
else concat(upper-case($fl), $tail)
),
''
)
結果は、必要に応じて正確になります。
underLinedString
以下は古い解決策です。
replace()関数は、置換が固定されていることを前提としています。したがって、この問題を解決するための最良のツールではありません。
これがワンライナーXPath2.0ソリューションです(そしてそれは確かにXSLT 2.0変換の一部として使用できます:)):
string-join(
(for $s in tokenize(.,'_'),
$fl in substring($s,1,1),
$tail in substring($s,2)
return
concat(upper-case($fl), $tail)
),
''
)
上記の式をXSLT2.0変換で次のように使用すると、次のようになります。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:sequence select=
"string-join(
(for $s in tokenize(.,'_'),
$fl in substring($s,1,1),
$tail in substring($s,2)
return
concat(upper-case($fl), $tail)
),
''
)
"/>
</xsl:template>
</xsl:stylesheet>
そしてそれをこのXMLドキュメントに適用します:
<t>under_lined_String</t>
必要な結果が生成されます:
UnderLinedString