#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}
. Если я нахожу такие вещи, я могу затем заменить их реальными значениями, прежде чем выполнять сравнение данных констант и тела.