выражение \b
не является частью регулярных выражений схемы XML. Он рассматривается как просто символ b, поэтому вы соответствуете b, за которым следует другой символ.
Ваша замещающая строка здесь upper-case('$0')
- это просто $0
, поэтому вы заменяете персонажа (ей) на себя.
Вы не можете сделать это, используя функцию замены - вам нужно что-то более похожее на xsl:analyze-string
из XSLT, но это не доступно в XQuery 1.0.
Насколько я могу судить, единственный способ решить эту проблему - с помощью рекурсивной функции. Можно использовать более простое решение с использованием токенизации, если вам не нужно сохранять разделители.
declare function local:title-case($arg as xs:string) as xs:string
{
if (string-length($arg) = 0)
then
""
else
let $first-word := tokenize($arg, "\s")[1]
let $first := substring($arg, 1, 1)
return
if (string-length($first-word) = 0)
then
concat($first, local:title-case(substring($arg, 2)))
else
if ($first-word = "a" (: or any other word that should not be capitalized :))
then
concat($first-word,
local:title-case(substring($arg, string-length($first-word) + 1)))
else
concat(upper-case($first),
substring($first-word, 2),
local:title-case(substring($arg, string-length($first-word) + 1)))
};
Вам также необходимо убедиться, что первое слово каждого заголовка пишется с большой буквы, даже если это короткое слово, например «а», но я оставляю это в качестве упражнения для читателя.