Reputation: 1843
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&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>
<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>
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
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
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
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