Xpath替换功能,处理匹配

时间:2009-12-04 21:18:39

标签: regex xpath xquery

我正在为“标题案例”字符串编写一个函数,例如“这是一个标题”,“这是一个标题。”以下行不起作用,因为正则表达式组引用丢失(或者我假设)。有没有一种简单的方法可以在替换函数中大写我的匹配字母?

replace( $input, '\b[a-z]' , upper-case('$0'))

1 个答案:

答案 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”这样的简短单词,但我把它作为练习留给读者。