我有一个要求,我必须根据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输入并与客户/ {$ custID} /资源进行验证。
目前,我正在使用以下代码进行检查。
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>
};
请告诉我,如何在xquery
中更改constant.xml的数据答案 0 :(得分:0)
以下查询说明如何在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]