Если вы правильно объявили префиксы пространства имен ns1
, ns2
и ns3
, этот XPath,
//ns3:person[@ns2:id = "a1"]/preceding-sibling::ns1:agent[1]/ns2:name
выберет имя агента, непосредственно предшествующего идентифицированному человеку.
Если вам нужна помощь в объявлении префиксов пространств имен XML, см. Как XPath работает с пространствами имен XML?
Обновление на основе OP комментарий:
В моем исходном документе xml узел агента не находится непосредственно перед узлом человека. Я буду запускать выражение в al oop для каждого узла person. Извините за путаницу, я отредактировал пример и вопрос, чтобы было более ясно, что мне нужно.
И в отредактированном вопросе:
Изменить: выражение XPath будет использоваться в al oop для каждого узла ns3: person, поэтому я не знаю заранее заданное значение атрибута c id.
Итак, в вашем l oop просто привяжите переменную, скажем $id
, в текущий ns3:person/@n2:id
, а затем проверьте ее в XPath:
//ns1:agent[@ns2:about = $id]/ns2:name
См. также Как передать параметр переменной в выражение XPath?