如何选择具有特定节点作为子节点的第一个前兄弟?

Sur*_*ran 5 xml xslt xpath xslt-1.0

我一直在尝试编写一个 XPath 语句,该语句将选择节点的第一个前同级。那个兄弟节点应该有一个特定的节点作为它的子节点。

例如:

<a>
    <c></c>
    ....
    <b></b>
</a>

<a></a>
....
....
<a></a>

<a>
   <b> start </b>
</a>
Run Code Online (Sandbox Code Playgroud)

在上面的 XML 中,如果我的上下文位于其 child 中a包含start文本的节点b。如何选择a子节点为 的前一个节点b

我试过,preceding-sibling::*[b][1]但它只选择节点,a如果b它是它的第一个孩子。我也试过,preceding-sibling::*[1][b]但它只检查前面的第一个a节点,如果它不包含b,则测试失败。

注意:我使用的是 XSLT 1.0

谁能建议我一个解决方案?

提前谢谢!!

mic*_*57k 8

我相信:

preceding-sibling::*[b][1]
Run Code Online (Sandbox Code Playgroud)

或最好:

preceding-sibling::a[b][1]
Run Code Online (Sandbox Code Playgroud)

应该工作得很好。

我尝试过previous-sibling::*[b][1] 但它只选择节点a,如果b 是它的第一个孩子。

我不认为是这样。


Tom*_*lak 5

像这样。(“第一个有<b>孩子的兄弟姐妹”):

preceding-sibling::a[b][1]
Run Code Online (Sandbox Code Playgroud)

或者这个(“第一个前面的兄弟姐妹,但前提是它有一个<b>孩子”):

preceding-sibling::a[1][b]
Run Code Online (Sandbox Code Playgroud)

多个谓词必须一个接一个为真。因此,这:

preceding-sibling::a[b and position() = 1]
Run Code Online (Sandbox Code Playgroud)

等价于第二个表达式,但不等价于第一个。