2009-12-04 94 views
0

我正在爲「標題大小寫」字符串例如「這是一個標題」,以「這是一個標題」。以下行不起作用,因爲正則表達式組引用丟失(或者我假設)。有沒有簡單的方法來大寫我的替換函數中的匹配字母?Xpath替換函數,處理匹配

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

回答

1

\b表達式不是XML Schema正則表達式的一部分。它被視爲字符b,所以你匹配b後跟另一個字符。

這裏您的替換字符串upper-case('$0')只是$0,所以您將自己替換字符。

您不能使用替換函數來執行此操作 - 您需要更多類似於XSLT中的xsl:analyze-string,但這在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))) 
}; 

您還需要確保即使是像「一」短字每部影片的第一個字母大寫,但我將它作爲一個練習留給讀者。