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

#xslt #xquery #osb

#xslt #xquery #osb

Вопрос:

У меня есть требование, при котором я должен проверять входящие данные на соответствие данным, присутствующим в constant.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 и выполнить проверку проверки с помощью customers/{$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>
};
  

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

Ответ №1:

Следующий запрос показывает, как развернуть встроенные шаблоны в ваших EndPointURLs и возвращать результат только в том случае, если есть совпадение.

 (: 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]
  

Комментарии:

1. Привет, Адамреттер, не могли бы вы объяснить нижеприведенную часть кода: if(соответствует ($part, «{$[^}] }»)) тогда пусть $src := replace($part, «{$([^}] )}», «$1») возвращает $body/element()[local-name(.) eq $src] else $part возвращает пусть $expanded-endpoint-url := concat(«/», string-join($parts, «/»)) возвращает (:тело, если serviceUrl соответствует расширенному EndPointURL 🙂 $body[serviceUrl eq $expanded-endpoint-url] Что здесь означает $ 1, также можете ли вы объяснить мне, если (соответствует ($part, «{$[^}] }»)) состояние.

2.For replace $1 — первая группа соответствия, используемая в регулярном выражении, то есть бит между ( ) в регулярном выражении.

3. matches выражение использует регулярное выражение для сопоставления любой строки, которая начинается {$ и заканчивается } . Я использую его, чтобы решить, содержат ли ваши части EndPointURL такие вещи, как {$custID} . Если я нахожу такие вещи, я могу затем заменить их реальными значениями, прежде чем выполнять сравнение данных констант и тела.