Как проверить в xquery, если строка содержит двойные кавычки? - PullRequest
0 голосов
/ 24 февраля 2011

Я новичок в xQuery, пытаюсь написать фрагменты xquery в oracle osb и хочу проверить, ограничен ли мой запрос двойными кавычками. У меня есть код, как показано ниже, но FN: заменить или FN: содержит не работает. Моя входная строка, qt = "test", тогда это фраза, если qt = test, тогда это просто

Как я могу сделать эту работу?

if ($qt != "") 

then let $newQt := fn:replace($qt,'"','\\"')

     return
     (    
      if (fn:contains($newQt,'\\"')) 

      then <stan:query> 

              <stan:queryTerm>{
                  fn:concat('string("',
                            $newQt,
                            '", mode="phrase", annotation_class="user")'
                  )
             }</stan:queryTerm>   

             <stan:mode>{'RAW'}</stan:mode>

           </stan:query>

      else <stan:query> 

             <stan:queryTerm>{
                 fn:concat(
                    'string("',
                    $newQt,
                    '", mode="simpleany", annotation_class="user")'
                 )
             }</stan:queryTerm>   

             <stan:mode>{'RAW'}</stan:mode>

           </stan:query>

     )

else <stan:query> 

       <stan:queryTerm>{$newQt}</stan:queryTerm>

       <stan:mode>{'AND'}</stan:mode>

     </stan:query>

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Чтобы проверить, содержит ли строка двойную кавычку, используйте fn:contains:

fn:contains($string, '"')

Ваш код различает три случая, а именно:

  • $ qt - пустая строка,
  • $ qt с кавычками,
  • $ qt без кавычек.

Я бы написал так:

if ($qt = "") then
  <stan:query>
    <stan:queryTerm/>
    <stan:mode>AND</stan:mode>
  </stan:query>
else if (fn:contains($qt, '"'))then
  <stan:query>
    <stan:queryTerm>string("{fn:replace($qt, '"', '\\"')}", mode="phrase", annotation_class="user")</stan:queryTerm>
    <stan:mode>RAW</stan:mode>
  </stan:query>
else
  <stan:query>
    <stan:queryTerm>string("{$qt}", mode="simpleany", annotation_class="user")</stan:queryTerm>
    <stan:mode>RAW</stan:mode>
  </stan:query>

Некоторые дополнительные замечания:

  • вы можете встраивать $ qt или его производную в другое содержимое элемента, поэтому нет необходимости предварительно собирать это с помощью fn: concat.
  • для создания stan не требуется встроенных выражений:mode.
  • обратная косая черта внутри замещающей строки должна быть экранирована другой обратной косой чертой, но это не должно выполняться где-либо еще.
0 голосов
/ 24 февраля 2011

На этот вопрос сложно ответить, потому что я не могу продублировать вашу проблему (я не могу легко заставить ваш код работать вообще).Я также не использовал «oracle osb», поэтому я не уверен, что это сильно поможет.

Я смог выполнить то, что, как мне кажется, вы пытаетесь сделать, используя следующееXQuery.(Мой процессор - Saxon-HE XQuery 9.3.0.4. Мне не нужно использовать префиксы fn: для функций, но, возможно, вы используете в Oracle?)

XQuery :

declare namespace stan = "http://notsurewhatthisis.com/stan";

let $qt := '"TEST"'
let $newQt := replace($qt,'"','\\"')
let $query :=
  if ($qt != '')
  then
    if (contains($qt,'"')) 
    then
      <stan:query>
        <stan:queryTerm type="phrase">{concat('string("',$newQt,'", mode="phrase", annotation_class="user")')}</stan:queryTerm>
        <stan:mode>RAW</stan:mode>
      </stan:query>
    else
      <stan:query>
        <stan:queryTerm type="phrase">{concat('string("',$newQt,'", mode="simpleany", annotation_class="user")')}</stan:queryTerm>
        <stan:mode>RAW</stan:mode>
      </stan:query>
  else
    <stan:query> 
      <stan:queryTerm>{$newQt}</stan:queryTerm>
      <stan:mode>AND</stan:mode>
    </stan:query>
return
  $query

выход :

<stan:query xmlns:stan="http://notsurewhatthisis.com/stan">
   <stan:queryTerm type="phrase">string("\"TEST\"", mode="phrase", annotation_class="user")</stan:queryTerm>
   <stan:mode>RAW</stan:mode>
</stan:query>

выход (после изменения $qt на let $qt := 'TEST'):

<stan:query xmlns:stan="http://notsurewhatthisis.com/stan">
   <stan:queryTerm type="phrase">string("TEST", mode="simpleany", annotation_class="user")</stan:queryTerm>
   <stan:mode>RAW</stan:mode>
</stan:query>

output (после изменения $qt на let $qt := '', что и будет if ($qt != "") then), которое вы поймаете):

<stan:query xmlns:stan="http://notsurewhatthisis.com/stan">
   <stan:queryTerm/>
   <stan:mode>AND</stan:mode>
</stan:query>

Надеюсь, это как-то поможет.

...