#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