Reputation: 1843
Given the following XML:
<?xml version="1.0" encoding="UTF-8"?>
<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.website.com/deep_linking/deep_linking.html?rooms=1&journey=Hotels&checkinDate=11092017&duration=7&suppliers=TT2&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>
</AccommodationSegment>
<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="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&journey=Hotels&checkinDate=12092017&duration=7&suppliers=TT2&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>
</AccommodationSegment>
</Accommodations>
And the following xpath query:-
(//*[local-name()="AccommodationSegment" and //*["RoomRate"][@RefundType="non_refundable"]])[1]
Why does the query return the first (Hotel) that contains 'refundable' rooms and not the second hotel which contains 'non_refundable' hotels? What is wrong with the query and/or is there a query which will work?
Upvotes: 1
Views: 43
Reputation: 52665
You can use below XPath
expression to match first AccommodationSegment
element that contains <RoomRate RefundType="non_refundable">
:
(//AccommodationSegment[./descendant::RoomRate[@RefundType="non_refundable"]])[1]
or you can modify your XPath
as
(//*[local-name()="AccommodationSegment" and .//*[@RefundType="non_refundable"]])[1]
Note that
["RoomRate"]
predicate as string will always return True
//*[@RefundType...
with .//*[@RefundType...
as your expression means find any element if its name is
"AccommodationSegment"
and if there is any element with attributeRefundType="non_refundable"
SOMEWHERE in the document
while my expression means:
find any element if its name is
"AccommodationSegment"
and if IT CONTAINS any element with attributeRefundType="non_refundable"
Upvotes: 2