我正在为“标题案例”字符串编写一个函数,例如“这是一个标题”,“这是一个标题。”以下行不起作用,因为正则表达式组引用丢失(或者我假设)。有没有一种简单的方法可以在替换函数中大写我的匹配字母?
replace( $input, '\b[a-z]' , upper-case('$0'))
答案 0 :(得分:1)
\b
表达式不是XML Schema正则表达式的一部分。它被视为字符b,因此您匹配b后跟另一个字符。
此处upper-case('$0')
的替换字符串仅为$0
,因此您将自行替换字符。
你无法使用替换函数执行此操作 - 您需要更多类似于XSLT的xsl:analyze-string
,但这在XQuery 1.0中不可用。
据我所知,解决这个问题的唯一方法是使用递归函数。如果您不需要保留分隔符,可以使用使用tokenize的更简单的解决方案。
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)))
};
你还需要确保每个标题的第一个单词都是大写的,即使它是一个像“a”这样的简短单词,但我把它作为练习留给读者。