Editado : Por esclarecimento do cartaz original, a primeira cadeia delimitada pelos sublinhados não deve ter sua carta de partida capitalizados.
Esta solução não usar recursividade e deve ser muito mais eficiente .
Aqui é a nova solução :
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)
),
''
)
O resultado é agora exatamente como necessário:
underLinedString
Abaixo está a solução antiga .
A função replace () supõe que você tem um substituto fixo - portanto, não é a melhor ferramenta para resolver este problema.
Aqui é uma única linha de XPath solução 2.0 (e, certamente, podem ser usadas como parte de um 2,0 transformação XSLT :)):
string-join(
(for $s in tokenize(.,'_'),
$fl in substring($s,1,1),
$tail in substring($s,2)
return
concat(upper-case($fl), $tail)
),
''
)
Quando utilizamos a expressão acima de uma transformação XSLT 2.0 como este :
<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>
e aplicá-lo sobre este documento XML:
<t>under_lined_String</t>
o resultado desejado é produzido :
UnderLinedString