DOMXPath получает родного брата в зависимости от предыдущего значения брата

Предположим, у меня это:

<foo> <bar>CCC</bar> <baz>sometexthere</baz> </foo> <foo> <bar>AAA</bar> <baz>sometext</baz> </foo> <foo> <bar>DDD</bar> <baz>something</baz> </foo> 

Теперь я хочу получить значение baz , которое появляется сразу после бара со значением AAA (!, но только со значением AAA !). Я не знаю, сколько у меня «foo», поэтому я не могу точно написать что-то вроде:

 $element->item(0) // I don't know the exact number 

Итак, как я могу получить значение baz, которое следует за баром с определенным значением?

(В приведенном выше примере я хотел бы получить sometext, потому что он появился после AAA )

Основной запрос состоял бы в том, чтобы найти bar s, которая содержит AAA , а затем перейти к соответствующему элементу baz .

 //foo/bar[.="AAA"]/../baz 

Или найдите все baz и фильтры на основе соответствующего bar .

 //foo/baz[../bar = "AAA"] 

Или baz s внутри foo s, содержащего bar имеющий AAA .

 //foo[bar="AAA"]/baz 

Если вы не знакомы с выражениями XPath, залейте XML Path Language (XPath) позже.

Существуют разные способы написания сопоставления XPath в зависимости от того, как именно вы хотите выполнить матч. Вот несколько вариантов:

Найдите baz, где есть также <bar>AAA</bar> , не обязательно предшествующий ему (он может появиться после, или между ними могут быть другие элементы):

 foo[bar = 'AAA']/baz 

Найти baz, которому предшествует <bar>AAA</bar> :

 foo/baz[preceding-sibling::bar = 'AAA'] foo/bar[. = 'AAA']/following-sibling::baz 

Найти baz, которому предшествует <bar>AAA</bar> :

 foo/baz[preceding-sibling::*[1]/self::bar = 'AAA'] foo/bar[. = 'AAA']/following-sibling::*[1]/self::baz 

Найдите <bar>AAA</bar> и возвращайте любой элемент сразу после него, не обязательно называемый baz.

 foo/bar[. = 'AAA']/following-sibling::*[1]