在Xquery中使用动态数据分配变量

时间:2014-06-30 14:29:30

标签: 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输入并与客户/ {$ 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的数据

1 个答案:

答案 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]