Отредактировано : В соответствии с пояснениями к исходному постеру, первая строка, разделенная подчеркиванием, не должна начинаться с заглавной буквы.
Это решение не использует рекурсию и должно быть более эффективным .
Вот новое решение :
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 () предполагает, что у вас есть фиксированная замена - поэтому это не лучший инструмент для решения этой проблемы.
Вот однострочное решение XPath 2.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)
),
''
)
Когда мы используем вышеприведенное выражение в преобразовании XSLT 2.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