Sai
Sai

Reputation: 17

How can I create xquery using xml response

The below mentioned is actual 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)

So We have to do the below changes. enter image description here

for that we have created the below mentioned table in DB, using JCA adapter we have received the response and created the xml response creating business service of JCA adapter in OSB.

enter image description here

condition: In query we need to fetch OTHER always so query will be as follows and if we get 2 results then pick one that is not “other” like pick CPT if it returned in result of select query and if we get 1 result then it will be always “Other”.

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

xml request and response of business service JCA adapter:

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

Response:

 <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.

Upvotes: 0

Views: 558

Answers (1)

Josh
Josh

Reputation: 513

I'm not sure I understand all of your question. But, it sounds like when two RefTickettype elements are returned, you want to select the one where codeName is not OTHER?

The following query checks to see how many RefTickettype elements are in the result. If there is only one, it is returned. If there is more than one, it will return all where codeName is not 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"]

Upvotes: 1

Related Questions