Эти выражения должны работать (результат - это отформатированная строка, содержащая необходимую информацию):
Xpath 1.0:
concat(normalize-space(//Rate[.>=300]/preceding::licenseNumber[1]),"|",//Rate[.>=300]/preceding::name[1],"|",2020-substring(//Rate[.>=300]/preceding::dob[1],1,4))
Xpath 2.0:
concat(replace(string-join(//Rate[.>=300]/preceding::person[1]/*[position()<3],"|"),"\W(\d+)\W(|.+)","$1$2"),"|",year-from-date(current-date())-year-from-date(//Rate[.>=300]/preceding::dob[1]))
Вывод (номер лицензии, имя, возраст):
'033329372|mike lornco|60'
Для проверки: https://www.freeformatter.com/xpath-tester.html
Я полагаю, у вас есть несколько предметов. Вы можете выполнить итерацию с помощью:
concat(normalize-space((//Rate[.>=300]/preceding::licenseNumber[1])[x]),"|",(//Rate[.>=300]/preceding::name[1])[x],"|",2020-number(substring((//Rate[.>=300]/preceding::dob[x])[1],1,4)))
Где [x] начинается с 1 до XXX.
EDIT: Ваши данные XML содержат ошибки. Вот что я использовал:
<data>
<rent number="101111">
<car>
<startDate>2018-02-08</startDate>
<endDate>2018-03-05</endDate>
<Location>Toranto</Location>
<carType>BMW</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 02389749372 </licenseNumber>
<name>Alexa Steve</name>
<dob>1999-03-01</dob>
<phone>
<type>Home</type>
<number>44 010 1111 4567</number>
</phone>
<email> Alexa@steve.ca</email>
</person>
<price>
<Rate>100.50</Rate>
</price>
</rent>
<rent number="103311">
<car>
<startDate>2018-07-01</startDate>
<endDate>2018-09-05</endDate>
<Location>ottawa</Location>
<carType>audi 8</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 033329372 </licenseNumber>
<name>mike lornco</name>
<dob>1960-03-03</dob>
<phone>
<type>Home</type>
<number>44 010 1111 3333</number>
</phone>
<email> mikelornokorenco@gmail.com</email>
</person>
<price>
<Rate>300.50</Rate>
</price>
</rent>
</data>
EDIT 2: Объяснение выражения XPath 1.0:
Мы используем concat
, чтобы объединить результат нескольких операций (каждая из которых отделена от a ","):
normalize-space(//Rate[.>=300]/preceding::licenseNumber[1])
: мы получаем номер лицензии человека, имеющего прокат автомобиля, который составляет> = 300 (синтаксис XPath). Мы используем normalize-space () для удаления начальных и закрывающих пробелов.
Мы ставим «|» чтобы отделить результат от следующего.
//Rate[.>=300]/preceding::name[1]
: мы получаем имя человека, у которого есть прокат автомобиля,> 300 = (синтаксис XPath).
2020-substring(//Rate[.>=300]/preceding::dob[1],1,4)
: мы получаем дату рождения человека, у которого прокат автомобилей составляет> = 300. С этой датой рождения мы извлекаем с помощью susbtring () год рождения («1,4» означает, что мы хотим получить значения от символа 1 до символа 4) , Наконец, мы вычтем это значение из 2020 года, чтобы получить возраст человека.
РЕДАКТИРОВАТЬ 3: XPath 1.0, чтобы получить самое длинное бронирование, см. Как получить самое длинное бронирование в XPATH 1.0?