Steerpike
Steerpike

Reputation: 1843

Xpath help to find element

From this XML:

<Accommodations>
   <AccommodationSegment AccommodationCode="627|26234" AccommodationId="15390132" AccommodationName="blah" Availability="available" BasicAdultCost="180.16" BoardCode="SC" BookableByFAB="true" BrandName="blah" ClassCode="2*" Currency="GBP" EndDate="20170918" ItineraryId="si1068" MaxChildAge="17" NormalisedName="BLAH" NumNights="7" ResortId="558" ResortName="blah" StartDate="20170911" Supplier="TT2" SyndicatorRanking="100" Type="Apartments">
  <AvailableBoardBasis>BB</AvailableBoardBasis>
  <AvailableBoardBasis>HB</AvailableBoardBasis>
  <AvailableBoardBasis>SC</AvailableBoardBasis>
  <Address Address1="blah" Address2="blah" Address3="Tenerife" CityOrTown="Puerto de la Cruz" Country="ES" PostCode="34324" />
  <TelephoneNumber>+34 922370565</TelephoneNumber>
  <Description>blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</Description>
  <GeoPosition Latitude="28.4129" Longitude="-16.5437" />
  <DirectLink System="FABRIX">
     <DirectLinkURL><![CDATA[https://ww9.websitek.com/deep_linking/deep_linking.html?rooms=1&amp;journey=Hotels&amp;checkinDate=11092017&amp;duration=7&amp;suppliers=TT2&amp;accommodationId=15390132]]></DirectLinkURL>
  </DirectLink>
  <AccommodationUnits>
     <AccommodationUnit AUID="H2" Code="2SC" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Self catering" QuantityAvailable="9">
        <RoomRate Amount="180.16" BoardBasis="SC" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" />
     </AccommodationUnit>
     <AccommodationUnit AUID="H2" Code="2BB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Bed and Breakfast" QuantityAvailable="9">
        <RoomRate Amount="216.91" BoardBasis="BB" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" />
     </AccommodationUnit>
     <AccommodationUnit AUID="H2" Code="2HB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Half board" QuantityAvailable="9">
        <RoomRate Amount="268.36" BoardBasis="HB" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" />
     </AccommodationUnit>
  </AccommodationUnits>
  <Address Address1="blah" Address2="blah" Address3="Tenerife" CityOrTown="Puerto de la Cruz" Country="ES" PostCode="73737" />
  <TelephoneNumber>0034 922384811</TelephoneNumber>
  <Description>blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</Description>
  <GeoPosition Latitude="28.4119" Longitude="-16.5473" />
  <DirectLink System="FABRIX">
     <DirectLinkURL><![CDATA[https://ww9.website.com/deep_linking/deep_linking.html?rooms=1&amp;journey=Hotels&amp;checkinDate=12092017&amp;duration=7&amp;suppliers=TT2&amp;accommodationId=16271549]]></DirectLinkURL>
  </DirectLink>
  <AccommodationUnits>
     <AccommodationUnit AUID="H4476" Code="4476BB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Bed and Breakfast" QuantityAvailable="9">
        <RoomRate Amount="250.04" BoardBasis="BB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" />
     </AccommodationUnit>
     <AccommodationUnit AUID="H4476" Code="4476HB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Half board" QuantityAvailable="9">
        <RoomRate Amount="276.97" BoardBasis="HB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" />
     </AccommodationUnit>
     <AccommodationUnit AUID="H4476" Code="4476FB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Full board" QuantityAvailable="9">
        <RoomRate Amount="303.88" BoardBasis="FB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" />
     </AccommodationUnit>
     <AccommodationUnit AUID="H4476" Code="4476AI" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - All inclusive" QuantityAvailable="9">
        <RoomRate Amount="317.34" BoardBasis="AI" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" />
     </AccommodationUnit>
  </AccommodationUnits>

I need to find get the first <AccommodationSegment>which contains the RefundType="non_refundable". There is an inner element of <RoomRate>. which holds this attribute.

The following xpath:

(//*[local-name()="AccommodationSegment" and //*["RoomRate"][@RefundType="non_refundable"]])[1]

Selects both AccommodationSegments(hotel( containing both AccommodationUnits(rooms) with refundable AND non_refundable RoomRate attributes

Why is this so?

Upvotes: 0

Views: 55

Answers (3)

Steve Wellens
Steve Wellens

Reputation: 20620

You were so close:

(//*[local-name()="AccommodationUnit"]//*["RoomRate"][@RefundType='refundable'])[1]//..

Modified test data (note I used the MaxOccupancy field as record IDs):

<?xml version="1.0" encoding="UTF-8"?>
<AccommodationUnits>
 <AccommodationUnit MaxOccupancy="1" MinOccupancy="1" MaxExtraChildren="0" MaxExtraInfants="0" QuantityAvailable="9" Name="Studio - Self catering" Code="2SC" AUID="H2">
   <RoomRate StartDate="20170909" EndDate="20170916" Amount="180.16" Currency="GBP" BoardBasis="SC" RefundType="refundable" />
 </AccommodationUnit>
 <AccommodationUnit MaxOccupancy="2" MinOccupancy="1" MaxExtraChildren="0" MaxExtraInfants="0" QuantityAvailable="9" Name="Studio - Bed and Breakfast" Code="2BB" AUID="H2">
   <RoomRate StartDate="20170909" EndDate="20170916" Amount="216.91" Currency="GBP" BoardBasis="BB" RefundType="refundable" />
 </AccommodationUnit>
 <AccommodationUnit MaxOccupancy="3" MinOccupancy="1" MaxExtraChildren="0" MaxExtraInfants="0" QuantityAvailable="9" Name="Studio - Self catering" Code="2SC" AUID="H2">
   <RoomRate StartDate="20170909" EndDate="20170916" Amount="180.16" Currency="GBP" BoardBasis="SC" RefundType="non-refundable" />
 </AccommodationUnit>
 <AccommodationUnit MaxOccupancy="4" MinOccupancy="1" MaxExtraChildren="0" MaxExtraInfants="0" QuantityAvailable="9" Name="Studio - Bed and Breakfast" Code="2BB" AUID="H2">
   <RoomRate StartDate="20170909" EndDate="20170916" Amount="216.91" Currency="GBP" BoardBasis="BB" RefundType="non-refundable" />
 </AccommodationUnit>
</AccommodationUnits>

Upvotes: 1

zx485
zx485

Reputation: 29022

I'm not sure that this is a general approach, but it's a very simple solution:

//AccommodationUnit[//@RefundType = 'refundable'][1]

This selects the first AccommodationUnit node of your example.

Upvotes: 0

eLRuLL
eLRuLL

Reputation: 18799

you can use the path you want as part of the actual node query you need, so something like this:

(//*[local-name()="AccommodationUnit" and //*["RoomRate"][@RefundType="refundable"]])[1]

Upvotes: 1

Related Questions