Функция замены Xpath, обработка совпадений - PullRequest
0 голосов
/ 05 декабря 2009

Я пишу функцию в строки "case case", например «Это заголовок» на «Это заголовок». Следующая строка не работает, потому что ссылка на группу регулярных выражений потеряна (или я так полагаю). Есть ли простой способ прописать мою совпадающую букву в функции замены?

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

1 Ответ

1 голос
/ 05 декабря 2009

выражение \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)))
};

Вам также необходимо убедиться, что первое слово каждого заголовка пишется с большой буквы, даже если это короткое слово, например «а», но я оставляю это в качестве упражнения для читателя.

...