DOMXPath根据先前的兄弟值获取兄弟姐妹

kkk*_*www 3 php xml dom 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>
Run Code Online (Sandbox Code Playgroud)

现在,我想获得baz值,它正好在bar之后,值为AAA(!但只有AAA值!).我不知道我有多少"foo",所以我不能写出类似的东西:

$element->item(0) // I don't know the exact number
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能得到baz的值,它在具有特定值的bar之后呢?

(对于上面的例子,我想得到一些文字,因为它来自AAA)

Joh*_*ica 6

根据您希望如何执行匹配,有不同的方法来编写匹配的XPath.以下是一些选项:

找到一个baz,其中也有一个<bar>AAA</bar>,但不一定在它之前(它可能会在之后,或者之间可能还有其他元素):

foo[bar = 'AAA']/baz
Run Code Online (Sandbox Code Playgroud)

找到一个前面的baz <bar>AAA</bar>:

foo/baz[preceding-sibling::bar = 'AAA']
foo/bar[. = 'AAA']/following-sibling::baz
Run Code Online (Sandbox Code Playgroud)

找到一个紧接着前面的baz <bar>AAA</bar>:

foo/baz[preceding-sibling::*[1]/self::bar = 'AAA']
foo/bar[. = 'AAA']/following-sibling::*[1]/self::baz
Run Code Online (Sandbox Code Playgroud)

找到<bar>AAA</bar>并返回紧随其后的任何元素,不一定命名为baz.

foo/bar[. = 'AAA']/following-sibling::*[1]
Run Code Online (Sandbox Code Playgroud)