Назначение переменной с динамическими данными в Xquery

У меня есть требование, согласно которому я должен проверять входящие данные на соответствие данным, представленным в константе.xml.

Скажем, ниже мой постоянный файл:

<Constant>
 <data>
  <Nation>India</Nation>
  <EndPointURL>customers/{$custID}/Resource</EndPointURL>
 </data>
 <data>
  <Nation>China</Nation>
  <EndPointURL>customers/{$custID}/Resource</EndPointURL>
 </data>
 <data>
  <Nation>Russia</Nation>
  <EndPointURL>customers/Resource</EndPointURL>
 </data>
</Constant>

и $body выглядит следующим образом:

<body>
 <custID>1234</custID>
 <Country>India</Country>
 <ServiceURL>customers/1234/Resource</ServiceURL>
</body>

Здесь я должен проверить, что если $body/ServiceURL = $Constant/data/EndPointURL.

И кардинальность данных (1...бесконечность).

Это способ, которым я могу изменить исходный CustID из ввода fr4om и выполнить проверку с клиентами/{$custID}/Resource.

В настоящее время я использую приведенный ниже код для проверки.

let $ServiceURL :=$body/ServiceURL/text()
let $country :=$body/Country/text()
for $service  in ($Constant/data) where
        ($service/Nation/text() = $Country)
        and ($service/EndPointURL/text() = $ServiceURL) 

        return
            <ServiceURL>{fn:concat('/REALTime/',$service/EndPointURL/text())}</ServiceURL>
};

Пожалуйста, дайте мне знать, как я могу изменить данные константы.xml в xquery


person user3790585    schedule 30.06.2014    source источник


Ответы (1)


В следующем запросе показано, как расширить встроенные шаблоны в EndPointURL и вернуть результат только в случае совпадения.

(: find the `data` for our `Country` :)
let $data := $Constant/data[Nation eq $body/Country]
return

(: expand the {$var} parts of the EndPointURL :)
let $parts := tokenize($data/EndPointURL, "/")
return
  let $expanded-parts :=
    for $part in $parts
    return
      if(matches($part, "\{\$[^}]+\}"))then
        let $src := replace($part, "\{\$([^}]+)\}", "$1")
        return
           $body/element()[local-name(.) eq $src]
      else
        $part
  return
    let $expanded-endpoint-url := concat("/", string-join($parts, "/"))
    return

       (: the body if the ServiceURL matches the expanded EndPointURL :)
       $body[ServiceURL eq $expanded-endpoint-url]
person adamretter    schedule 30.06.2014
comment
Привет, Адамреттер. Не могли бы вы объяснить приведенную ниже часть кода: [^}]+)\}, $1) return $body/element()[local-name(.) eq $src] else $part return let $expanded-endpoint-url := concat(/, string-join( $parts, /)) return (: тело, если ServiceURL соответствует расширенному URL-адресу конечной точки :) $body[ServiceURL eq $expanded-endpoint-url] Что здесь означает $1, также можете объяснить мне, если (соответствует ($part, \{\$[^}]+\})) условие. - person user3790585; 01.07.2014
comment
Для replace $1 — это первая совпадающая группа, используемая в регулярном выражении, т. е. бит между ( ) в регулярном выражении. - person adamretter; 01.07.2014
comment
выражение matches использует регулярное выражение для соответствия любой строке, которая начинается {$ и заканчивается }. Я использую его, чтобы решить, содержат ли части вашего EndPointURL такие вещи, как {$custID}. Если я найду такие вещи, я могу заменить их реальными значениями, прежде чем сравнивать данные констант и тело. - person adamretter; 01.07.2014