2015-08-14 2 views
1

Это контекст XML:XPath сравнить стоимость ребенка с родителя атрибута

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <travel Selectedcity="USPDX" CitySeq="2"> 
    <travelcode>01</travelcode> 
    <cities> 
     <city> 
     <seqno>3</seqno> 
     <city_code>USPDX</city_code> 
     <arrival>2015-04-23T14:37:00.143</arrival> 
     </city> 
     <city> 
     <seqno>1</seqno> 
     <city_code>JPHIC</city_code> 
     <arrival>2015-05-09T06:26:00</arrival> 
     </city> 
     <city> 
     <seqno>2</seqno> 
     <additional_code>11222</additional_code> 
     <city_code>USPDX</city_code> 
     <arrival>2015-04-20T20:35:00</arrival> 
     </city> 
    </cities> 
    </travel> 
</root> 

Я ищу для прибытия в город, указанный в атрибуте CitySeq путешествий (CitySeq = «2»). Так что мне нужно совместить seqno = CitySeq. Результат, который я ожидаю, - <arrival>2015-04-20T20:35:00</arrival>.

Это работает: /travel/cities/city[seqno=2]/arrival

Но вместо "2" не является: /travel/cities/city[seqno=/travel/@CitySeq]/arrival

Предложения? (Заранее спасибо)

+0

BTW, я использую этот сайт для его проверки: http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm. Например: XPATH (/ travel/cities/city [seqno = 3]/arrival) –

ответ

1

EDIT: Я проверил следующее выражение в http://www.freeformatter.com/xpath-tester.html

/root/travel/cities/city[seqno=/root/travel/@CitySeq]/arrival 

я получил результат:

Element='<arrival>2015-04-20T20:35:00</arrival>' 

OLD Ответ: Я не думаю, что XPath поддерживает такие встроенные выражения. Лучше всего сделать это в два этапа. Псевдо-код следующим образом (предполагается, что Java):

String citySeq = xPath.compile("/travel/@CitySeq").evaluate(xmlDocument); 
String arrival = xPath.compile("/travel/cities/city[seqno=" + citySeq + "]/arrival").evaluate(xmlDocument); 

Кроме того, вы, вероятно, следует проверить на возможность того, что citySeq не найден в первую очередь.

+0

Если может быть несколько элементов 'travel', это неверно, так как предикат является истинным, если существует элемент' travel', который имеет Атрибут CitySeq со значением 'seqno'. Лучше использовать «предка», поскольку другой ответ использовал его – lkuty

1

Другим вариантом является ось ancestor, чтобы перейти к соответствующему элементу предка travel.

/root/travel/cities/city[seqno=ancestor::travel/@CitySeq]/arrival 

Это поможет особенно в том случае, когда существует несколько travel элементов в root.

Смежные вопросы