XPath для получения братьев и сестер на основе значения базового брата и сестры

#xml #xpath

Вопрос:

Я пытаюсь построить выражение XPath для поиска братьев и сестер на основе данных базового брата.

Пример XML:

 lt;datagt;  lt;metagt;  lt;materialgt;123456lt;/materialgt;  lt;typegt;alt;/typegt;  lt;/metagt;  lt;metagt;  lt;materialgt;456789lt;/materialgt;  lt;typegt;blt;/typegt;  lt;/metagt;   lt;dataobj0gt;  lt;materialgt;123456lt;/materialgt;  lt;somedatagt;Test0lt;/somedatagt;  lt;/dataobj0gt;  lt;dataobj0gt;  lt;materialgt;456789lt;/materialgt;  lt;somedatagt;Test1lt;/somedatagt;  lt;/dataobj0gt;    lt;dataobj1gt;  lt;materialgt;123456lt;/materialgt;  lt;somedatagt;Test2lt;/somedatagt;  lt;/dataobj1gt;  lt;dataobj1gt;  lt;materialgt;456789lt;/materialgt;  lt;somedatagt;Test3lt;/somedatagt;  lt;/dataobj1gt; lt;/datagt;  

Я перебираю все lt;metagt; элементы, и для каждого мета-элемента я хочу найти соответствующие dataobj0 и dataobj1. Поэтому , когда я нахожусь внутри lt;metagt;lt;materialgt;123456lt;/materialgt;lt;/metagt; , я хочу получить доступ /data/dataobj0[material = "123456"] и /data/dataobj1[material = "123456"]

Я думал что-то вроде: ../dataobj0[material = ./material] или following-sibling::dataobj0[material = ./material] сработало бы, но в данном случае ./material уже есть номер родного брата.

Есть идеи, как я мог бы получить номер материала текущего мета-элемента здесь?

Ответ №1:

Чтобы получить, например, объект dataobj, соответствующий второму lt;metagt; (тому, с lt;typegt;blt;/typegt; которым), используйте

 //*[starts-with(name(),"dataobj")][material=(//meta/material)[2]]/somedata  

Если вы используете xpathgt;1.0, вы можете соединить их следующим образом:

 //*[starts-with(name(),"dataobj")][material=(//meta/material)[2]]/(somedata/text() | //meta[.//material=material][2]//type/text())  

и получите этот вывод:

 b Test1 Test3