如何使用xml响应创建xquery

时间:2016-01-14 19:50:41

标签: xquery osb

下面提到的是实际的xquery。

declare variable $rankCode_DL3UJ :=("CPT","FO","FM");
declare variable $rankCode_DL4UJ :=("CRFO","CL");
declare variable $type :=("DOM","ISH");

declare function local:getboardingPriorityCode($flightType as element(), $rankCode as element()) as xs:string
{
if(data($flightType) = $type) then
    'DHD'
else
    if(data($rankCode) = $rankCode_DL3UJ) then
        'DL3UJ'
    else if(data($rankCode) = $rankCode_DL4UJ) then
        'DL4UJ'
    else
        'DL5UJ'
};

declare function local:getPreferredClass($flightType as    element(flightCategory:Code)) as xs:string
{

if(data($flightType) = $type) then
    'Y'
else
    'J'

};

declare function xf:createDeadheadReservationRQ-to-     PassengerDetailsRQ($createDeadheadReservationRQ1 as   element(ns1:CreateDeadheadReservationRQ),$CreateDeadHeadReservationAdapterSelect   RS as element(ns3:RefTickettypeCollection),
$airBookRS as element(flightCategory:GetFlightCategoryRS))
as element(ns2:PassengerDetailsRQ) {
    <ns2:PassengerDetailsRQ Version = "2.0.0">
        <ns2:SpecialReqDetails>
            <ns2:AddRemarkRQ>
                <ns2:RemarkInfo>
                    <ns2:Remark Type = "General">
                        <ns2:Text>{  data($createDeadheadReservationRQ1/ns1:SpecialRequestDetails/ns1:Remark) }</ns2:Text>
                    </ns2:Remark>
                </ns2:RemarkInfo>
            </ns2:AddRemarkRQ>
            <ns2:SpecialServiceRQ>
                <ns2:SpecialServiceInfo>
                    <ns2:SecureFlight SegmentNumber = "A" SSR_Code = "DOCS">
                        <ns2:PersonName DateOfBirth = "{   data($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:DateOfBirth) }"
                                        Gender = "{   data($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:Gender) }"
                                        NameNumber = "1.1">
                            <ns2:GivenName>{     data($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:PassengerName/ns1:GivenName) }</ns2:GivenName>
                            <ns2:Surname>{ data($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:PassengerName/ns1:Surname) }</ns2:Surname>
                        </ns2:PersonName>
                        <ns2:VendorPrefs>
                            <ns2:Airline Hosted = "true"/>
                        </ns2:VendorPrefs>
                    </ns2:SecureFlight>
                    <ns2:Service SSR_Code = "{ data($createDeadheadReservationRQ1/ns1:SpecialRequestDetails/ns1:RankBasedSSR) }">
                        <ns2:VendorPrefs>
                            <ns2:Airline Hosted = "true"/>
                        </ns2:VendorPrefs>
                    </ns2:Service>
                </ns2:SpecialServiceInfo>
            </ns2:SpecialServiceRQ>
        </ns2:SpecialReqDetails>
        <ns2:TravelItineraryAddInfoRQ>
            <ns2:AgencyInfo>
                <ns2:Ticketing TicketType = "{fn:concat('7PS-',  local:getboardingPriorityCode($airBookRS/flightCategory:ServiceType/flightCategory:Code, $createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:RankCode), local:getPreferredClass($airBookRS/flightCategory:ServiceType/flightCategory:Code))}"/>
            </ns2:AgencyInfo>
            <ns2:CustomerInfo>
                <ns2:PersonName>
                    <ns2:GivenName>{
                             xs:string(fn:concat($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:PassengerName/ns1:GivenName,' ',
                             $createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:PassengerName/ns1:Title))
                    }</ns2:GivenName>
                    <ns2:Surname>{ xs:string($createDeadheadReservationRQ1/ns1:PassengerInfo/ns1:PassengerName/ns1:Surname) }</ns2:Surname>
                </ns2:PersonName>
            </ns2:CustomerInfo>
        </ns2:TravelItineraryAddInfoRQ>
    </ns2:PassengerDetailsRQ>
};

  declare variable $createDeadheadReservationRQ1 as           element(ns1:CreateDeadheadReservationRQ) external;
  declare variable $airBookRS as element(flightCategory:GetFlightCategoryRS)  external;
  declare variable $CreateDeadHeadReservationAdapterSelectRS as   element(ns3:RefTickettypeCollection) external;

   xf:createDeadheadReservationRQ-to-  PassengerDetailsRQ($createDeadheadReservationRQ1, $airBookRS,     $CreateDeadHeadReservationAdapterSelectRS)

所以我们必须做以下的改变。 enter image description here

为此我们在DB中创建了下面提到的表,使用JCA适配器我们收到了响应,并在OSB中创建了创建JCA适配器业务服务的xml响应。

enter image description here

条件:在查询中我们需要总是获取OTHER,所以查询将如下,如果我们得到2个结果,那么选择一个不是“其他”的选择CPT,如果它在select查询的结果中返回,如果我们得到1结果然后它将永远是“其他”。

Select *from <Table> where Code_name in (‘OTHER’, 'value received in request');

业务服务JCA适配器的xml请求和响应:

Request:
<cre:CreateDeadHeadReservationAdapterSelect_CODE_NAMEInputParameters>
 <cre:CODE_NAME>CPT</cre:CODE_NAME>
 </cre:CreateDeadHeadReservationAdapterSelect_CODE_NAMEInputParameters>

响应:

 <cre:RefTickettypeCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-     instance" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cre="http://xmlns.oracle.com/pcbpel/adapter/db/top/CreateDeadHeadReservati  onAdapter">
<cre:RefTickettype>
<cre:codeName>CPT</cre:codeName>
<cre:codeType>Rank</cre:codeType>
<cre:priorityCode>DL3UJ</cre:priorityCode>
<cre:preferredClass>J</cre:preferredClass>
</cre:RefTickettype>
<cre:RefTickettype>
<cre:codeName>OTHER</cre:codeName>
<cre:codeType>Other</cre:codeType>
<cre:priorityCode>DL7UJ</cre:priorityCode>
<cre:preferredClass>J</cre:preferredClass>
</cre:RefTickettype></cre:RefTickettypeCollection>



So using the above response could you pls help me to create the xquery logic.

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的所有问题。但是,听起来好像返回了两个RefTickettype元素,您想要选择codeName不是OTHER的那个元素吗?

以下查询检查结果中有多少RefTickettype个元素。如果只有一个,则返回。如果有多个,则会返回codeName不是OTHER的所有内容。

declare namespace cre="http://xmlns.oracle.com/pcbpel/adapter/db/top/CreateDeadHeadReservationAdapter";

let $response := 

  <cre:RefTickettypeCollection>
    <cre:RefTickettype>
      <cre:codeName>CPT</cre:codeName>
      <cre:codeType>Rank</cre:codeType>
      <cre:priorityCode>DL3UJ</cre:priorityCode>
      <cre:preferredClass>J</cre:preferredClass>
    </cre:RefTickettype>
    <cre:RefTickettype>
      <cre:codeName>OTHER</cre:codeName>
      <cre:codeType>Other</cre:codeType>
      <cre:priorityCode>DL7UJ</cre:priorityCode>
      <cre:preferredClass>J</cre:preferredClass>
    </cre:RefTickettype>
  </cre:RefTickettypeCollection>

return

  if (count($response/cre:RefTickettype) eq 1) then
    $response/cre:RefTickettype
  else 
    $response/cre:RefTickettype[cre:codeName ne "OTHER"]